如何从同一数据帧中的字典键创建列?

2024-05-15 21:33:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,类似于:

|   | a | b                |
|---|---|------------------|
| 0 | a | {'d': 1, 'e': 2} |
| 1 | b | {'d': 3, 'e': 4} |
| 2 | c | NaN              |
| 3 | d | {'f': 5}         |

如何制作这样的东西:

|   | a | b                | d | e | f |
|---|---|------------------|---|---|---|
| 0 | a | {'d': 1, 'e': 2} | 1 | 2 |nan|
| 1 | b | {'d': 3, 'e': 4} | 3 | 4 |nan|
| 2 | c | NaN              |nan|nan|nan|
| 3 | d | {'f': 5}         |nan|nan| 5 |


我尝试执行此操作Split / Explode a column of dictionaries into separate columns with pandas,但由于存在空值,因此引发了一个错误。
“float”对象没有属性“items”


Tags: columnsof数据pandas错误withcolumnnan
2条回答

将NaN替换为None,然后继续

df = pd.DataFrame({'a':['a','b','c','d'], 
                   'b':[{'d': 1, 'e': 2},
                        {'d': 3, 'e': 4},
                        np.nan,
                        {'f': 5}]
                   })

df = df.where(pd.notnull(df), None)
pd.concat([df, df['b'].apply(pd.Series)], axis=1)

输出:

   a                 b    d    e    f
0  a  {'d': 1, 'e': 2}  1.0  2.0  NaN
1  b  {'d': 3, 'e': 4}  3.0  4.0  NaN
2  c              None  NaN  NaN  NaN
3  d          {'f': 5}  NaN  NaN  5.0

您可以尝试以下操作:

>>> df
   a                 b
0  a  {'d': 1, 'e': 2}
1  b  {'d': 3, 'e': 4}
2  c               NaN
3  d          {'f': 5}

>>> df.join(pd.DataFrame.from_records(df['b'].mask(df.b.isna(), {}).tolist()))

   a                 b    d    e    f
0  a  {'d': 1, 'e': 2}  1.0  2.0  NaN
1  b  {'d': 3, 'e': 4}  3.0  4.0  NaN
2  c               NaN  NaN  NaN  NaN
3  d          {'f': 5}  NaN  NaN  5.0

相关问题 更多 >