【问题标题】:Finding frequency of each value in all categorical columns across a dataframe查找数据框中所有分类列中每个值的频率
【发布时间】:2022-01-22 08:42:03
【问题描述】:

我有一个如下所示的数据框

df = pd.DataFrame(
    {'sub_code' : ['CSE01', 'CSE01', 'CSE01', 
                   'CSE02', 'CSE03', 'CSE04',
                   'CSE05', 'CSE06'],
     'stud_level' : [101, 101, 101, 101, 
                  101, 101, 101, 101],
     'grade' : ['STA','STA','PSA','STA','STA','SSA','PSA','QSA']})

我想做下面的事情

a) 获取数据帧所有分类列中每个唯一值的频率

我尝试了以下方法,但它既不高效也不优雅

df['sub_code'].value_counts() # need to key in column name manually
df['grade'].value_counts() # need to key in column name manually
df.select_dtypes(include='object').value_counts() #produces incorrect output

由于我的真实数据有 200 多列和 100k 行,有没有什么有效的方法可以做到这一点?

我希望我的输出如下所示。如果有任何其他更好的方法来显示以下输出,我也欢迎。我不知道如何以简洁的方式捕获这些信息。所以,请分享您的建议

【问题讨论】:

    标签: python pandas dataframe numpy categorical-data


    【解决方案1】:

    使用meltvalue_counts

    out = (df.select_dtypes(object)
           .melt(var_name="Column", value_name="Value")
           .value_counts(dropna=False)
           .reset_index(name="Frequency")
           .sort_values(by=['Column','Frequency','Variable'], ascending=[True,False,True])
           .reset_index(drop=True))
    

    输出:

         Column Variable  Frequency
    0     grade      STA          4
    1     grade      PSA          2
    2     grade      QSA          1
    3     grade      SSA          1
    4  sub_code    CSE01          3
    5  sub_code    CSE02          1
    6  sub_code    CSE03          1
    7  sub_code    CSE04          1
    8  sub_code    CSE05          1
    9  sub_code    CSE06          1
    

    【讨论】:

    • @TheGreat value_counts 默认会丢弃 NA 值。在 value_counts 中设置dropna=False
    【解决方案2】:

    另一种方法是使用get_dummies

      s=pd.get_dummies(df.drop(columns=['stud_level'])).sum(0).to_frame('Freq').reset_index()
    s=s['index'].str.split('\_(?=[A-Z0-9]+$)', expand=True).join(s.iloc[:,-1]).rename(columns={0:'Column',1:'Value'})
    

    结果

        Column  Value  Freq
    0  sub_code  CSE01     3
    1  sub_code  CSE02     1
    2  sub_code  CSE03     1
    3  sub_code  CSE04     1
    4  sub_code  CSE05     1
    5  sub_code  CSE06     1
    6     grade    PSA     2
    7     grade    QSA     1
    8     grade    SSA     1
    9     grade    STA     4
    

    【讨论】:

    • 谢谢,为帮助点赞。但我不希望在处理大数据时明确提及列名,这是不可能的(提及数字列名以删除它们)
    • 感谢,就像我第一次说的那样,我最喜欢的出路是融化,复制@enke 答案没有用。干杯
    猜你喜欢
    • 2020-04-16
    • 2023-03-25
    • 2020-01-30
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多