将Pandas列中的字典转换为数据框

3

我有一个 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列转换为单独的列,并将其加入到主数据框中,以列名为key,列中的计数为value。以下是一个示例(由于篇幅原因,一些列被省略):
    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 DataFrameturning a collections counter into dictionary,但它们并没有回答我的问题。我不知道是否可能实现。我只知道可以从字典创建一个Dataframe。如果有关于此问题的stackoverflow帖子,请指点一下。
2个回答

4

如果性能不重要,将每个字典转换为 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书时,请告诉我,我将成为第一个购买的人 :) :) 上帝保佑您,干杯。 - RavinderSingh13

0

在pandas中正确的做法是使用json_normalize

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

并加入:

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

@jezrael的回答有效。不过我也想尝试这个方法。谢谢你的回复。 - Mengezi Dhlomo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接