我有一个由列node、component和前面的单词组成的dataframe。节点包含许多相同的值(按字母顺序排序),组件也包含许多相同的值,但被置乱,前面的单词可以是所有类型的单词,但也有一些相同的单词。在
我现在要做的是创建某种横截面/频率列表,显示组件的频率和前面链接到节点的单词。在
假设这是我的测向:
node precedingWord comp
banana the lel
banana a lel
banana a lal
coconut some lal
coconut few lil
coconut the lel
我期望一个频率列表,显示每个唯一的节点,以及在给定匹配条件的其他列中找到某个值的次数,例如
^{pr2}$预期产量:
node det1 det2 unspecified comp1 comp2 comp3
banana 2 1 0 2 0 1
coconut 0 1 0 1 1 1
我已经为一个变量做过了,但我不知道如何将comp列放在适当的位置:
det1 = ["a"]
det2 = ["the"]
df.loc[df.preceding_word.isin(det1), "determiner"] = "det1"
df.loc[df.preceding_word.isin(det2), "determiner"] = "det2"
df.loc[df.preceding_word.isin(det1 + det2) == 0, "determiner"] = "unspecified"
# Create crosstab of the node and gender
freqDf = pd.crosstab(df.node, df.determiner)
我从here那里得到这个答案。如果有人能解释loc
的作用,那也会有很大帮助。在
考虑到安迪的答案,我尝试了以下方法。注意,“predingword”已被“gender”取代,它只包含中性、非中性、性别等价值观。在
def frequency_list():
# Define content of gender classes
neuter = ["het"]
non_neuter = ["de"]
# Add `gender` column to df
df.loc[df.preceding_word.isin(neuter), "gender"] = "neuter"
df.loc[df.preceding_word.isin(non_neuter), "gender"] = "non_neuter"
df.loc[df.preceding_word.isin(neuter + non_neuter) == 0, "gender"] = "unspecified"
g = df.groupby("node")
# Create crosstab of the node, and gender and component
freqDf = pd.concat([g["component"].value_counts().unstack(1), g["gender"].value_counts().unstack(1)])
# Reset indices, starting from 1, not the default 0!
""" Crosstabs don't come with index, so we first set the index with
`reset_index` and then alter it. """
freqDf.reset_index(inplace=True)
freqDf.index = np.arange(1, len(freqDf) + 1)
freqDf.to_csv("dataset/py-frequencies.csv", sep="\t", encoding="utf-8")
输出接近我想要的,但不完全是:
component
)显示行,然后为gender
显示相同的节点。在0
。在我想要的是:
请注意,我正在寻找最有效的答案。我实际上是在处理加载,数据加载,所以每循环每秒都有计数!在
你的问题至少可以分成三部分:
loc
在做什么?在一般说明
Pandas为某些操作提供了加速,所以在使用循环之前尝试库实现(见下文)
旋转
1.与普通熊猫:
两列示例:
^{pr2}$2.使用
Counter
在我的例子中,这个比纯
pandas
快一点(分组时每个循环52.6µs vs 92.9µs;不计算旋转)3.据我所知,这是一个自然语言处理问题。您可以尝试将所有数据组合成一个字符串,并使用} 并设置
sklearn
中的^{ngram_range=(1, 2)
。比如:合并
两种选择: 1
concat
df1.设置索引(“word”) df2.set_索引(“word”) 数据输出=帕金森病([df1,df2],轴=1)2.
merge
loc
它用一个参数索引行或用两个参数索引
row,column
。它使用行/列名称或布尔索引(如您对行的情况)。在如果每个性别只有一篇文章,可以使用直接比较而不是
in
操作,这可能会加快速度:与
或者更短但可读性较差
更新:这是一个^{} :
这显然是一个更干净(对大数据更有效的算法)。在
然后用axis=1的concat将它们粘在一起(即,添加更多列,而不是添加更多行)。在
^{pr2}$我可能会这样(作为一个多重索引),如果你想让它变平,就不要传递键(尽管可能会出现重复单词的问题):
旁白:当列名存在时,如果concat不要求显式地传递列名(作为键kwarg),那就更好了。。。
原始答案
可用于
value_counts
:把这个放在一个单独的框架里有点棘手:
在执行concat之前,可以将列映射到det1、det2等,例如,如果将映射作为字典。
或者,你也可以使用列表理解法(如果你没有听写或者没有特定的标签):
相关问题 更多 >
编程相关推荐