我正在尝试使用pandas和Python根据数据帧制作频率表。实际上,它与a previous question of mine which used R完全相同。

假设我在熊猫中有一个像这样的数据框(实际上,该数据框要大得多,但出于说明目的,我限制了行):

node    |   precedingWord
-------------------------
A-bom       de
A-bom       die
A-bom       de
A-bom       een
A-bom       n
A-bom       de
acroniem    het
acroniem    t
acroniem    het
acroniem    n
acroniem    een
act         de
act         het
act         die
act         dat
act         t
act         n


我想使用这些值对每个节点的前单词数进行计数,但要包含子类别。例如:要为其添加值的一列标题为neuter,另一列non-neuter和最后一个restneuter将包含所有值,其中previousWord是以下值之一:thetdatnon-neuter将包含dedie,,而rest将包含不属于neuternon-neuter的所有内容。 (最好是动态的,换句话说,rest使用某种用于中性和非中性的反向变量。或者简单地从长度中减去中性和非中性的值。该节点的行)。

输出示例(在一个新的数据框中,假设为freqDf,看起来像这样:

node    |   neuter   | nonNeuter   | rest
-----------------------------------------
A-bom       0          4             2
acroniem    3          0             2
act         3          2             1


我找到了an answer to a similar question,但用例并不完全相同。在我看来,在这个问题上所有变量都是独立的。但是,以我为例,很明显,我有多个具有相同节点的行,所有这些行都应降低到一个单一频率-如上面的预期输出所示。

我以为是这样(未经测试):

def specificFreq(d):
    for uniqueWord in d['node']
        return pd.Series({'node': uniqueWord ,
            'neuter': sum(d['node' == uniqueWord] & d['precedingWord'] == 't|het|dat'),
            'nonNeuter':  sum(d['node' == uniqueWord] & d['precedingWord'] == 'de|die'),
            'rest': len(uniqueWord) - neuter - nonNeuter}) # Length of rows with the specific word, distracted by neuter and nonneuter values above

df.groupby('node').apply(specificFreq)


但是我非常怀疑这是做这样事情的正确方法。

最佳答案

按照R解决方案中的建议,您可以先更改名称,然后执行交叉列表:

df.loc[df.precedingWord.isin(neuter), "gender"] = "neuter"
df.loc[df.precedingWord.isin(non_neuter), "gender"] = "non_neuter"
df.loc[df.precedingWord.isin(neuter + non_neuter)==0, "gender"] = "rest"
# neuter + non_neuter is the concatenation of both lists.

pd.crosstab(df.node, df.gender)
gender    neuter  non_neuter  rest
node
A-bom          0           4     2
acroniem       3           0     2
act            3           2     1


这是更好的方法,因为如果neuternon_neuter中的单词不存在,则不会像以前的解决方案那样引发precedingword



前溶液,清洁度较低。

给定数据框,您可以进行简单的交叉制表:

ct = pd.crosstab(df.node, df.precedingWord)


这使:

pW        dat  de  die  een  het  n  t
node
A-bom       0   3    1    1    0  1  0
acroniem    0   0    0    1    2  1  1
act         1   1    1    0    1  1  1


然后,您只想将某些列加起来:

neuter = ["t", "het", "dat"]
non_neuter = ["de","die"]
freqDf = pd.DataFrame()

freqDf["neuter"] = ct[neuter].sum(axis=1)
ct.drop(neuter, axis=1, inplace=1)

freqDf["non_neuter"] = ct[non_neuter].sum(axis=1)
ct.drop(non_neuter, axis=1, inplace=1)

freqDf["rest"] = ct.sum(axis=1)


这给你KeyError

          neuter  non_neuter  rest
node
A-bom          0           4     2
acroniem       3           0     2
act            3           2     1


高温超导

08-26 04:23