首页 > 解决方案 > 将字典中存在但数据中不存在的类别添加到计数输出中 - python

问题描述

我正在为 df 中的每列创建一些类别计数。列中不存在所有可能的类别 - 但它们存储在字典中。有没有可能将不在数据中的类别附加到 value_counts 数据中?有关预期输出的一些代码和示例,请参见下文。这些列有很多,所以在最后手动附加是不好的。太感谢了!

包含所有可能响应的字典

df_dic = {'veggie': ['cucumber', 'broccoli', 'spinach', 'kale', 'potatoe', 'pepper', 'tomatoe'],
          'fruit': ['banana', 'orange', 'grapes', 'pear', 'melon', 'apple']}

数据


df = pd.DataFrame([('cucumnber', 'apple'),
                   ('broccoli', 'pear'),
                   ('spinach', 'orange'),
                   ('spinach', 'orange'),
                   ('kale', 'apple'),
                   ('kale', 'banana'),
                   ('potatoe', 'pear')],
                  columns=['veggie', 'fruit'])

value_counts 命令

dat = []

for col in df:
    out_num = pd.DataFrame(df[col].value_counts()).sort_index().add_suffix('_num')
    out_per = pd.DataFrame(df[col].value_counts(normalize=True)*100).sort_index().add_suffix('_per')
    out = pd.concat([out_num, out_per], axis=1)
    dat.append(out)

输出例如 dat[0]

          veggie_num  veggie_per
broccoli            1   14.285714
cucumnber           1   14.285714
kale                2   28.571429
potatoe             1   14.285714
spinach             2   28.571429

预期产出

         veggie_num  veggie_per
brocoli            1   14.285714
cucumber           1   14.285714
kale                2   28.571429
potatoe             1   14.285714
spinach             2   28.571429
pepper              0   00.00
tomatoe             0   00.00

标签: pythonpandas

解决方案


reindexdf_dic添加到之前的值dat

dat = []

for col in df:
    out_num = pd.DataFrame(df[col].value_counts()).sort_index().add_suffix('_num')
    out_per = pd.DataFrame(df[col].value_counts(normalize=True)*100).sort_index().add_suffix('_per')
    out = pd.concat([out_num, out_per], axis=1).reindex(df_dic[col], fill_value=0)
    dat.append(out)

dat[0]

          veggie_num  veggie_per
cucumber           1   14.285714
broccoli           1   14.285714
spinach            2   28.571429
kale               2   28.571429
potato             1   14.285714
pepper             0    0.000000
tomato             0    0.000000

*注意值需要拼写匹配才能正常工作。


通过一些简化:

dat = []

for col in df:
    out = df[col].value_counts().to_frame().add_suffix('_num')
    out[f'{col}_per'] = (df[col].value_counts(normalize=True) * 100)
    out = out.reindex(df_dic[col], fill_value=0)
    dat.append(out)

dat[0]

          veggie_num  veggie_per
cucumber           1   14.285714
broccoli           1   14.285714
spinach            2   28.571429
kale               2   28.571429
potato             1   14.285714
pepper             0    0.000000
tomato             0    0.000000

数据框和dict使用:

df_dic = {
    'veggie': ['cucumber', 'broccoli', 'spinach', 'kale', 'potato', 'pepper',
               'tomato'],
    'fruit': ['banana', 'orange', 'grapes', 'pear', 'melon', 'apple']
}

df = pd.DataFrame([('cucumber', 'apple'),
                   ('broccoli', 'pear'),
                   ('spinach', 'orange'),
                   ('spinach', 'orange'),
                   ('kale', 'apple'),
                   ('kale', 'banana'),
                   ('potato', 'pear')],
                  columns=['veggie', 'fruit'])

推荐阅读