从以下数据帧df
开始:
df = pd.DataFrame({'node':[1,2,3,3,3,5,5],'lang':['it','en','ar','ar','es','uz','es']})
我在试着建造这个建筑:
^{pr2}$因此,基本上通过列表将每个节点的lang
元素和频率分组到一行中。到目前为止我所做的:
# Getting the unique langs / node
a = df.groupby('node')['lang'].unique().reset_index(name='langs')
# Getting the frequency of lang / node
b = df.groupby('node')['lang'].value_counts().reset_index(name='lfreq')
c = b.groupby('node')['lfreq'].unique().reset_index(name='lfreq')
然后在node
上合并:
d = pd.merge(a,c,on='node')
经过这次手术,我得到的是:
node langs lfreq
0 1 [it] [1]
1 2 [en] [1]
2 3 [ar, es] [2, 1]
3 5 [uz, es] [1]
正如您可能注意到的那样,最后一行只有一个[1]
出现的两个[uz, es]
的频率,而不是预期的[1,1]
的列表。有没有一种方法可以更简洁地进行分析,以获得所需的输出?在
我会使用agg函数和tolist()
更换
^{pr2}$与
还有维奥拉:
在某种程度上,因为您提到(在评论中)速度对于拥有4000万行的重要性,我建议您看看下面的内容。在
一般来说,使用更平坦的结构(python的zen)会更好,更具体地说,您希望pandas/numpy列是简单类型(int和float),而不是对象。在
考虑到像groupby这样的pandas方法,上面的结构应该比以列表形式存储更容易完成任务,而且几乎可以保证更快,可能更快。我假设您希望使用这种结构进行进一步的处理,但即使不使用,以这种方式将数据制成表格也会更快。在
您可以使用参数^{} ^{} 使用参数
return_counts=True
:相关问题 更多 >
编程相关推荐