我保存了电影数据集以进行收入预测。但是,此数据集的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
答案 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