首页 > 解决方案 > 返回所有或特定列的频率计数的函数

问题描述

我可以在一个带有总列的漂亮数据框中返回所有列的频率。

for column in df:     
    df.groupby(column).size().reset_index(name="total")

Count   total
0   1   423
1   2   488
2   3   454
3   4   408
4   5   343

Precipitation   total
0   Fine        7490
1   Fog         23
2   Other       51
3   Raining     808

Month   total
0   1   717
1   2   648
2   3   710
3   4   701

我将循环放在一个函数中,但这仅返回第一列“Count”。

def count_all_columns_freq(dataframe_x):
    for column in dataframe_x:
        return dataframe_x.groupby(column).size().reset_index(name="total")

count_all_columns_freq(df)

Count   total
0   1   423
1   2   488
2   3   454
3   4   408
4   5   343

有没有办法使用切片或其他方法来做到这一点,例如for column in dataframe_x[1:]:

标签: pythondataframe

解决方案


根据您的评论,您只想返回一个数据框列表:

def count_all_columns_freq(df):
    return [df.groupby(column).size().reset_index(name="total")
            for column in df]

您可以通过多种方式选择 in 中的列pandas,例如通过切片或传递列列表(如 in )df[['colA', 'colB']]。您无需为此更改功能。

就个人而言,我会返回一本字典:

def frequency_dict(df):
    return {column: df.groupby(column).size()
            for column in df}

# so that I could use it like this:
freq = frequency_dict(df)
freq['someColumn'].loc[value]

编辑: “如果我想数数NaN怎么办?”

在这种情况下,您可以传递dropna=Falsegroupby(这适用于pandas >= 1.1.0):

def count_all_columns_freq(df):
    return [df.groupby(column, dropna=False).size().reset_index(name="total")
            for column in df]

推荐阅读