python - 如何从两列计算数据帧
问题描述
我有数据框,想计算名称在两列中出现的次数
data=pd.DataFrame({'TEAM 1':['Mark','Peter','Andy','Tony'],'Team 2':
['Andy','Tony','Jhon','Peter']})
所以名字 Andy 将被视为 2,而 Jhon 是 1
预期输出
Mark 1
Andy 2
Tony 2
Jhon 1
Peter 2
我使用了这段代码,但它不起作用
data.groupby('TEAM 1')['Team 2'].count()
解决方案
>>> data.stack().value_counts()
Andy 2
Tony 2
Peter 2
Jhon 1
Mark 1
正如 中所指出的,在调用之前Ch3steR's comment
将 df 转换为numpy.array
然后将其展平会产生大约 2X 更快的结果:ravel
pd.value_counts
>>> pd.value_counts(data.to_numpy().ravel())
Andy 2
Tony 2
Peter 2
Jhon 1
Mark 1
dtype: int64
基准测试:
>>> data = pd.concat([data] * 1000000) # 4_000_000 rows
>>> %timeit data.stack().value_counts()
1.21 s ± 27.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> %timeit pd.value_counts(data.to_numpy().ravel())
667 ms ± 16.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
更新:根据证明更快:anky's comment
collections.Counter
>>> %timeit pd.Series(Counter(np.ravel(data)))
501 ms ± 4.28 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
推荐阅读
- java - 如何在 CSVFormat 中避免逗号前的反斜杠
- kubernetes - 在 kind 集群中编辑 extraPortMappings
- git - 如何从某个点之前删除提交?
- javascript - 导航菜单图标关闭位置 - Vue/Vuetify
- java - 如何从命令行收集正在运行的 java 应用程序的 JVM 指标?
- mongodb - 如何在MongoDB中计算年龄占总数的百分比
- javascript - 为什么组件在通过 $.ajax 获取成功数据时不重新呈现?
- scala - 将 lambda 定义作为 spark rdd 中元组的一部分会导致大小大幅增加
- c# - 将 AES 密钥存储和检索到文件
- sql-server - 索引可以优化 UPDATE 语句吗?