python - 使用 Python Pandas 从数据框中获取总 values_count
问题描述
我有一个包含几列的 Python 熊猫数据框。现在我想将所有值复制到一个列中以获取包含的 values_count 结果所有值。最后,我需要 string1、string2、n 的总数。最好的方法是什么?
index row 1 row 2 ...
0 string1 string3
1 string1 string1
2 string2 string2
...
解决方案
如果性能是一个问题,请尝试:
from collections import Counter
Counter(df.values.ravel())
#Counter({'string1': 3, 'string2': 2, 'string3': 1})
或者stack
它合二为一Series
然后使用value_counts
df.stack().value_counts()
#string1 3
#string2 2
#string3 1
#dtype: int64
对于具有少量列的较大(长)DataFrames,循环可能比堆叠更快:
s = pd.Series()
for col in df.columns:
s = s.add(df[col].value_counts(), fill_value=0)
#string1 3.0
#string2 2.0
#string3 1.0
#dtype: float64
此外,还有一个 numpy 解决方案:
import numpy as np
np.unique(df.to_numpy(), return_counts=True)
#(array(['string1', 'string2', 'string3'], dtype=object),
# array([3, 2, 1], dtype=int64))
df = pd.DataFrame({'row1': ['string1', 'string1', 'string2'],
'row2': ['string3', 'string1', 'string2']})
def vc_from_loop(df):
s = pd.Series()
for col in df.columns:
s = s.add(df[col].value_counts(), fill_value=0)
return s
小的DataFrame
%timeit Counter(df.values.ravel())
#11.1 µs ± 56.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit df.stack().value_counts()
#835 µs ± 5.46 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit vc_from_loop(df)
#2.15 ms ± 34.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.unique(df.to_numpy(), return_counts=True)
#23.8 µs ± 241 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
长DataFrame
df = pd.concat([df]*300000, ignore_index=True)
%timeit Counter(df.values.ravel())
#124 ms ± 1.85 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit df.stack().value_counts()
#337 ms ± 3.59 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit vc_from_loop(df)
#182 ms ± 1.58 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit np.unique(df.to_numpy(), return_counts=True)
#1.16 s ± 1.09 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
推荐阅读
- android - 关闭 AlertDialog.Builder
- jquery - 航点未触发
- maven - 马文
标记奇怪的行为 - javascript - 在带有十字符号的文本框中搜索结果
- css - CSS 内联工作,但不是来自样式表
- javascript - D3.JS 中的可折叠图:多个根点
- unit-testing - vue.js unit:test w test-utils 和 Jest:我如何在方法中测试 - window.open()?
- sql-server - 如何在 SQL 中将五个表与另一个依赖项连接起来
- css - width vs. flex-basis: [width] - 元素被扩展了?
- marketo - 如何通过 API 在 Marketo 中的列表中添加潜在客户(电子邮件、姓名)