从以下数据帧df开始:
df = pd.DataFrame({'node':[1,2,3,3,3,5,5],'lang':['it','en','ar','ar','es','uz','es']})
我正在尝试构建结构:
node langs lfreq
0 1 [it] [1]
1 2 [en] [1]
2 3 [ar, es] [2, 1]
3 5 [uz, es] [1, 1]
所以基本上将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')
然后在节点上合并:
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]列表.有没有办法以更简洁的方式执行分析以获得所需的输出?
解决方法:
部分是因为你提到(在评论中)速度对于拥有4000万行的重要性,我建议你看看更接近以下内容的东西.
df.groupby(['node','lang'])['lang'].count()
node lang
1 it 1
2 en 1
3 ar 2
es 1
5 es 1
uz 1
一般来说,你会用更平坦的结构(Python的禅)来改善你,更具体地说你希望你的pandas / numpy列是简单的类型(整数和浮点数),而不是对象.
由于像groupby这样的pandas方法,上面的结构应该比你作为列表存储更容易做事,并且几乎可以保证更快,可能更快.我假设您希望使用此结构进行进一步处理,但即使不是,也会以这种方式将数据制表更快.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。