gpt4 book ai didi

python - 使用Python创建高级频数表

转载 作者:行者123 更新时间:2023-12-01 04:33:10 24 4
gpt4 key购买 nike

我正在尝试使用 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

我想使用这些值来计算每个节点前面的单词数,但带有子类别。例如:要向其中添加值的一列标题为“中性”,另一列为“非中性”,最后一列为“休息”。 neuter 将包含 previousWord 为以下值之一的所有值:thetdatnon-neuter 将包含 dedie,rest 将包含不属于 的所有内容>中性非中性。 (如果这可以是动态的,那就太好了,换句话说,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 中,它不会引发 KeyError 就像之前的解决方案一样。

<小时/>

以前的解决方案,不太干净。

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

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)

这给你freqDf:

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

HTH

关于python - 使用Python创建高级频数表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32095818/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com