首页 > 解决方案 > 让 size() 或 groupby & count 跨所有列工作

问题描述

抱歉,如果这似乎是重复的,我发现很多使用 groupby 和 size 的接近答案,但没有一个将列标题作为索引返回。

我有以下 df (实际上有 340 列和许多行):

import pandas as pd
data = {'Name_Clean_40_40_Correct':['0','1','0','0'], 'Name_Clean_40_80_Correct':['0','1','1','N/A'],'Name_Clean_40_60_Correct':['N/A','N/A','0','1']}
df_third = pd.DataFrame(data)

我正在尝试计算每列的“0”、“1”和“N/A”的实例。所以我想让索引是列名,列是'0'、'1'和'N/A'。

我正在尝试这个,但恐怕它效率很低或不正确,因为它不会完成。

def countx(x, colname):
    df_thresholds=df_third.groupby(colname).count()

for col in df_thresholds.columns:    
    df_thresholds[col + '_Count'] = df_third.apply(countx, axis=1, args=(col,))

我可以为一栏做到这一点,但这会很痛苦:

df_thresholds=df_third.groupby('Name_Clean_100_100_Correct').count()
df_thresholds=df_thresholds[['Name_Raw']]
df_thresholds=df_thresholds.T

标签: pythonpandas

解决方案


如果我理解正确,这应该有效:

df_third.apply(pd.Series.value_counts)

结果:

     Name_Clean_40_40_Correct  ...  Name_Clean_40_60_Correct
0                         3.0  ...                         1
1                         1.0  ...                         1
N/A                       NaN  ...                         2

顺便说一句:只选择包含“正确”的列:

df_third.filter(like='Correct')

转置形式df_third.T

                            0    1  N/A
Name_Clean_40_40_Correct  3.0  1.0  NaN
Name_Clean_40_80_Correct  1.0  2.0  1.0
Name_Clean_40_60_Correct  1.0  1.0  2.0

推荐阅读