这与:exploding a pandas dataframe column
这是我的数据框:
import pandas as pd
import numpy as np
d = {'id': [1, 1, 1, 2, 2, 2], 'data': [{'foo':True}, {'foo':False, 'bar':True}, {'foo':True, 'bar':False, 'baz':True}, {'foo':False}, {'foo':False, 'bar':False}, {'foo':False, 'bar':True, 'baz':False}]}
df = pd.DataFrame(data=d)
df
我想为data
列中的每个值创建一个新列,并分别具有相关的True
和False
值。 (和np.nan
表示任何空值)。
我的新数据框如下所示:
a = {'id': [1, 1, 1, 2, 2, 2], 'data': [{'foo':True}, {'foo':False, 'bar':True}, {'foo':True, 'bar':False, 'baz':True}, {'foo':False}, {'foo':False, 'bar':False}, {'foo':False, 'bar':True, 'baz':False}], 'foo':[True, False, True, False, False, False], 'bar':[np.nan, True, False, np.nan, False, True], 'baz':[np.nan, np.nan, True, np.nan, np.nan, False] }
df1 = pd.DataFrame(data=a)
df1
我不确定用Series.str.get_dummies
是否可以实现,因为我不确定如何映射True
和False
值。感谢任何帮助!
答案 0 :(得分:1)
列出该列以获取记录列表,然后将其转换为DataFrame:
# pd.concat([df, pd.DataFrame(df['data'].tolist())], axis=1)
df.join(pd.DataFrame(df['data'].tolist()))
id data bar baz foo
0 1 {'foo': True} NaN NaN True
1 1 {'foo': False, 'bar': True} True NaN False
2 1 {'foo': True, 'bar': False, 'baz': True} False True True
3 2 {'foo': False} NaN NaN False
4 2 {'foo': False, 'bar': False} False NaN False
5 2 {'foo': False, 'bar': True, 'baz': False} True False False
如果输出中不需要“数据”列,则可以pop
对其进行扩展之前:
df.join(pd.DataFrame(df.pop('data').tolist()))
id bar baz foo
0 1 NaN NaN True
1 1 True NaN False
2 1 False True True
3 2 NaN NaN False
4 2 False NaN False
5 2 True False False
答案 1 :(得分:1)
我正在使用from_records
pd.DataFrame.from_records(d['data'],index=d['id'])
bar baz foo
1 NaN NaN True
1 True NaN False
1 False True True
2 NaN NaN False
2 False NaN False
2 True False False