【问题标题】:Turn dictionaries inside a pandas column into a dataframe将 pandas 列中的字典转换为数据框
【发布时间】:2019-11-24 08:44:07
【问题描述】:

我有一个Dataframe,看起来像这样:

    cus_id          cat_counts
0   4462            {'LOUNGE': 2}
1   5482            {'MAJOR APPLIANCES': 2, 'SMALL APPLIANCES': 1}
2   8101            {'BEDDING': 1, 'MAJOR APPLIANCES': 1}
3   3388            {'MAJOR APPLIANCES': 1, 'BEDROOM SUITES': 1}
5   3030            {'ACCESSORIES': 1, 'VISUAL': 2, 'MAJOR APPLIANCES' : 2}
6   8942            {'VISUAL': 1, 'AUDIO': 1, 'BEDDING': 1}
7   5775            {'ACCESSORIES': 2, 'VISUAL': 1}
8   5489            {'ACCESSORIES': 1, 'KITCHENWARE': 1, 'BEDDING' : 1
9   9370            {'ACCESSORIES': 1, 'VISUAL': 2, 'MAJOR APPLIANCES' : 5}
10  5936            {'KITCHENWARE': 1, 'ACCESSORIES': 4, 'VISUAL': 3}
11  3854            {'ACCESSORIES': 1, 'VISUAL': 2}
12  4016            {'LOOSE CARPETING': 1, 'BEDDING': 1}
13  3503            {'HOME OFFICE': 2}

我想将cat_counts 列转换为连接到主数据框的单独列,其中keys 是列,values 是列中的计数。这是一个例子(一些列已经被省略):

    cus_id         LOUNGE | MAJOR APPLIANCES | SMALL APPLIANCES | BEDDING | BEDROOM SUITES | ACCESSORIES
0   4462              2           0                  0               0           0               0
1   5482              0           2                  1               0           0               0
2   8101              0           1                  0               1           0               0  
3   3388              0           1                  0               0           1               0
5   3030              0           2                  0               0           0               1
6   8942              0           0                  0               1           0               0 
7   5775              0           0                  0               0           0               2
8   5489              0           0                  0               1           0               1
9   9370              0           5                  0               0           0               1
10  5936              0           0                  0               0           0               4
11  3854              0           0                  0               0           0               1
12  4016              0           0                  0               1           0               0
13  3503              0           0                  0               0           0               0

我已经尝试过df['cat_counts'].apply(lambda a: pd.DataFrame.from_dict(a)),但我得到了一个错误 If using all scalar values, you must pass an index。我已经检查了这个问题 Transform a Counter object into a Pandas DataFrame & turning a collections counter into dictionary 但他们没有回答我的问题。我不知道这是否可能。我所知道的是你可以从字典中创建一个Dataframe。如果有关于此的 stackoverflow 帖子,请指出正确的方向

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    如果性能不重要,则将每个 dict 转换为 Series 并将缺失值替换为 0

    df['cat_counts'].apply(lambda a: pd.Series(a)).fillna(0)
    

    为了提高性能,将列转换为DataFrame

    pd.DataFrame(df['cat_counts'].tolist()).fillna(0)
    

    DataFrame.pop 用于提取列,DataFrame.join 用于添加原始列:

    df1 = df.join(pd.DataFrame(df.pop('cat_counts').tolist()).fillna(0).astype(int))
    

    【讨论】:

    • @jezrael,首先问候先生!我要感谢您所有出色的解决方案和解释(我会努力关注您,并且经常想知道您有多好,以及您如何在 Pandas 中变得如此出色:)),这只是您为 Pandas 编写自己的书时的一个请求,让我知道那我会是第一个买它的人:) :) 上帝保佑你,干杯。
    【解决方案2】:

    在 pandas 中执行此操作的正确方法是使用 json_normalize

    from pandas.io.json import json_normalize
    json_normalize(df.cat_counts)
    

    加入:

    pd.concat([df, json_normalize(df.cat_counts)])
    

    【讨论】:

    • @jezrael 的回答有效。不过我也想试试这个。感谢您的回复
    猜你喜欢
    • 2014-06-12
    • 1970-01-01
    • 2019-02-22
    • 2017-07-16
    • 2020-12-22
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    相关资源
    最近更新 更多