将字典/列表拆分为单独的列

时间:2019-06-09 11:37:25

标签: python-3.x pandas

我保存了电影数据集以进行收入预测。但是,此数据集的genres列中有一个字典,该字典在1行中有2个或更多列表。 DataFrame看起来像这不是实际的数据帧,但是数据帧与此类似:

df = pd.DataFrame({'a':[1,2,3], 'b':[{'c':1}, [{'c':4},{'d':3}], [{'c':5, 'd':6},{'c':7, 'd':8}]]})

这是输出

    a   b
0   1   {'c': 1}
1   2   [{'c': 4}, {'d': 3}]
2   3   [{'c': 5, 'd': 6}, {'c': 7, 'd': 8}]

我需要将此列拆分为单独的列。

我如何使用apply(pd.series)方法做到这一点,这就是我得到的输出结果

    0                   1                   c
0   NaN                 NaN                 1.0
1   {'c': 4}            {'d': 3}            NaN
2   {'c': 5, 'd': 6}    {'c': 5, 'd': 6}    NaN

但我希望这样:

    a   c      d
0   1   1      NaN
1   2   4      3
2   3   5,7    6,8 

1 个答案:

答案 0 :(得分:2)

我不知道通过使用apply(pd.Series)是否可以实现您想要的目标,因为您在'b'列中混合使用了多种类型:您有字典和字典列表。也许是这样,不确定。

但是我会怎么做。
首先,遍历您的列以使用所有新列名(即,字典的键)构建一个集合。
然后,您可以将apply与自定义函数一起使用,以提取每一列的值。
请注意,此列中的值是字符串,是必需的,因为您希望将其与#2行之类的逗号分隔并置。

newcols = set()
for el in df['b']:
    if isinstance(el, dict):
        newcols.update(el.keys())
    elif isinstance(el, list):
        for i in el:
            newcols.update(i.keys())

def extractvalues(x, col):
    if isinstance(x['b'], dict):
        return x['b'].get(col, np.nan)
    elif isinstance(x['b'], list):
        return ','.join(str(i.get(col, '')) for i in x['b']).strip(',')

for nc in newcols:
    df[nc] = df.apply(lambda r: extractvalues(r, nc), axis=1)

df.drop('b', axis=1, inplace=True)

您的数据框现在为:

   a    c    d
0  1    1  NaN
1  2    4    3
2  3  5,7  6,8