大熊猫将列值拆分为单独的列

时间:2019-06-23 01:02:07

标签: python pandas dataframe

这与: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列中的每个值创建一个新列,并分别具有相关的TrueFalse值。 (和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是否可以实现,因为我不确定如何映射TrueFalse值。感谢任何帮助!

2 个答案:

答案 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

参考:Convert a list of dictionaries to pandas DataFrame

答案 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