使用 Python 创建高级频率 table
Create advanced frequency table with Python
我正在尝试根据具有 pandas
和 Python 的数据帧生成频率 table。实际上它与 .
完全相同
假设我在 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
将包含 precedingWord 是以下值之一的所有值:t
、het
、dat
。 non-neuter
将包含 de
和 die,
,而 rest
将包含不属于 neuter
或 non-neuter
的所有内容。 (如果这可以是动态的,那就太好了,换句话说,rest
使用某种用于中性和 non-neuter 的反向变量。或者简单地减去中性和 [=47 中的值=] 来自具有该节点的行的长度。)
示例输出(在新的数据框中,假设 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
这个更好,因为如果 neuter
或 non_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
我正在尝试根据具有 pandas
和 Python 的数据帧生成频率 table。实际上它与
假设我在 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
将包含 precedingWord 是以下值之一的所有值:t
、het
、dat
。 non-neuter
将包含 de
和 die,
,而 rest
将包含不属于 neuter
或 non-neuter
的所有内容。 (如果这可以是动态的,那就太好了,换句话说,rest
使用某种用于中性和 non-neuter 的反向变量。或者简单地减去中性和 [=47 中的值=] 来自具有该节点的行的长度。)
示例输出(在新的数据框中,假设 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
这个更好,因为如果 neuter
或 non_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