Xin*_*Xin 40 python numpy pandas
如果Pandas DataFrame有多个具有分类值(0或1)的列,是否可以方便地同时获取每列的value_counts?
例如,假设我生成一个DataFrame,如下所示:
import numpy as np
import pandas as pd
np.random.seed(0)
df = pd.DataFrame(np.random.randint(0, 2, (10, 4)), columns=list('abcd'))
Run Code Online (Sandbox Code Playgroud)
我可以像这样得到一个DataFrame:
a b c d
0 0 1 1 0
1 1 1 1 1
2 1 1 1 0
3 0 1 0 0
4 0 0 0 1
5 0 1 1 0
6 0 1 1 1
7 1 0 1 0
8 1 0 1 1
9 0 1 1 0
Run Code Online (Sandbox Code Playgroud)
如何方便地获取每列的值计数并方便地获得以下内容?
a b c d
0 6 3 2 6
1 4 7 8 4
Run Code Online (Sandbox Code Playgroud)
我目前的解决方案是:
pieces = []
for col in df.columns:
tmp_series = df[col].value_counts()
tmp_series.name = col
pieces.append(tmp_series)
df_value_counts = pd.concat(pieces, axis=1)
Run Code Online (Sandbox Code Playgroud)
但是必须有一种更简单的方法,比如堆叠,旋转或分组?
EdC*_*ica 69
只需致电apply并通过pd.Series.value_counts:
In [212]:
df = pd.DataFrame(np.random.randint(0, 2, (10, 4)), columns=list('abcd'))
df.apply(pd.Series.value_counts)
Out[212]:
a b c d
0 4 6 4 3
1 6 4 6 7
Run Code Online (Sandbox Code Playgroud)
Ted*_*rou 20
其实是有一个相当有趣的,先进的与做这个问题的方式crosstab和melt
df = pd.DataFrame({'a': ['table', 'chair', 'chair', 'lamp', 'bed'],
'b': ['lamp', 'candle', 'chair', 'lamp', 'bed'],
'c': ['mirror', 'mirror', 'mirror', 'mirror', 'mirror']})
df
a b c
0 table lamp mirror
1 chair candle mirror
2 chair chair mirror
3 lamp lamp mirror
4 bed bed mirror
Run Code Online (Sandbox Code Playgroud)
我们可以先融化DataFrame
df1 = df.melt()
df1
columns index
0 a table
1 a chair
2 a chair
3 a lamp
4 a bed
5 b lamp
6 b candle
7 b chair
8 b lamp
9 b bed
10 c mirror
11 c mirror
12 c mirror
13 c mirror
14 c mirror
Run Code Online (Sandbox Code Playgroud)
然后使用交叉表函数计算每列的值.这会将数据类型保留为int,而当前选择的答案不是这种情况:
pd.crosstab(index=df['index'], columns=df['columns'])
columns a b c
index
bed 1 1 0
candle 0 1 0
chair 2 1 0
lamp 1 2 0
mirror 0 0 5
table 1 0 0
Run Code Online (Sandbox Code Playgroud)
或者在一行中,将列名称扩展为参数名称**(这是高级的)
pd.crosstab(**df.melt(var_name='columns', value_name='index'))
Run Code Online (Sandbox Code Playgroud)
此外,value_counts现在是一个顶级功能.因此,您可以简化当前选择的以下答案:
df.apply(pd.value_counts)
Run Code Online (Sandbox Code Playgroud)
选择所有分类列并同时创建包含所有值计数的数据框的解决方案:
df = pd.DataFrame({
'fruits': ['apple', 'mango', 'apple', 'mango', 'mango', 'pear', 'mango'],
'vegetables': ['cucumber', 'eggplant', 'tomato', 'tomato', 'tomato', 'tomato', 'pumpkin'],
'sauces': ['chili', 'chili', 'ketchup', 'ketchup', 'chili', '1000 islands', 'chili']})
cat_cols = df.select_dtypes(include=object).columns.tolist()
(pd.DataFrame(
df[cat_cols]
.melt(var_name='column', value_name='value')
.value_counts())
.rename(columns={0: 'counts'})
.sort_values(by=['column', 'counts']))
counts
column value
fruits pear 1
apple 2
mango 4
sauces 1000 islands 1
ketchup 2
chili 4
vegetables pumpkin 1
eggplant 1
cucumber 1
tomato 4
Run Code Online (Sandbox Code Playgroud)
小智 7
您还可以尝试以下代码:
for i in heart.columns:
x = heart[i].value_counts()
print("Column name is:",i,"and it value is:",x)
Run Code Online (Sandbox Code Playgroud)