我有下表:
a b c d e
1 0 1 0 0
0 1 0 1 1
0 0 0 1 1
1 0 0 1 1
0 0 0 1 1
我需要转换此表,以便对于每个列,我得到的计数为0和1。我需要下表:
fields count_1 count_0
------------------------------
a 2 3
b 1 4
c 1 4
d 4 1
e 4 1
我知道,如果我使用value_counts(),我将为我返回每个值的计数。但是,我真的不知道如何创建该表。你能帮忙吗?
答案 0 :(得分:2)
让我们使用sum
和pd.concat
:
pd.concat([(df==0).sum().rename('count_0'), df.sum().rename('count_1')], axis=1)
输出:
count_0 count_1
a 3 2
b 4 1
c 4 1
d 1 4
e 1 4
%timeit df.apply(pd.Series.value_counts).transpose().add_prefix('count_')
每个循环6.4 ms±278 µs(平均±标准偏差,共运行7次,每个循环100个循环)
%timeit df.stack().groupby(level=[1]).value_counts().unstack().add_prefix('count_')
每个循环2.78 ms±69.5 µs(平均±标准偏差,共运行7次,每个循环100个循环)
%%timeit
df_out = pd.DataFrame([
[x.strip() for x in df.columns], sum(df.values == 1), sum(df.values == 0)
]).T
df_out.columns = ['fields', 'count_1', 'count_0']
每个循环1.15 ms±27.4 µs(平均±标准偏差,共运行7次,每个循环1000次)
%timeit pd.concat([(df==0).sum().rename('count_0'), df.sum().rename('count_1')], axis=1)
每个循环1.09 ms±9.69 µs(平均±标准偏差,共运行7次,每个循环1000次)
答案 1 :(得分:1)
让我们尝试按列应用value_counts
:
df.apply(pd.Series.value_counts).transpose().add_prefix('count_')
count_0 count_1
a 3 2
b 4 1
c 4 1
d 1 4
e 1 4
或者,类似地使用stack
和unstack
:
df.stack().groupby(level=[1]).value_counts().unstack().add_prefix('count_')
count_0 count_1
a 3 2
b 4 1
c 4 1
d 1 4
e 1 4
答案 2 :(得分:1)
尝试一下
import pandas as pd
df = pd.DataFrame([
[x.strip() for x in df.columns], sum(df.values == 1), sum(df.values == 0)
]).T
df.columns = ['fields', 'count_1', 'count_0']
fields count_1 count_0
0 a 2 3
1 b 1 4
2 c 1 4
3 d 4 1
4 e 4 1