【发布时间】:2015-08-20 17:44:33
【问题描述】:
我正在尝试基于带有 pandas 和 Python 的数据框制作频率表。其实和a previous question of mine which used R一模一样。
假设我在 pandas 中有一个如下所示的数据框(实际上数据框要大得多,但出于说明目的,我限制了行数):
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
我想使用这些值来计算每个节点的precedingWords,但带有子类别。例如:要添加值的一列标题为neuter,另一列为non-neuter,最后一列为rest。 neuter 将包含所有值,previousWord 是以下值之一:t,het,dat。 non-neuter 将包含 de 和 die, 和 rest 将包含不属于 neuter 或 non-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)
但我非常怀疑这是做这种事情的正确方法。
【问题讨论】:
标签: python pandas dataframe word-frequency