我有一只 Pandas DataFrame看起来像:
import pandas as pd
print(pd.__version__)
df0 = pd.DataFrame([
[12, None, [{'dst': '925', 'object': 'Lok. Certification', 'admin': 'valid'},
{'dst': '935', 'object': 'Lok. Administration', 'admin': 'true'},
{'dst': '944', 'object': 'Lok. Customer', 'admin': 'false'},
{'dst': '945', 'object': 'Lok. Customer', 'admin': 'false'},
{'dst': '954', 'object': 'Lok. Certification-C', 'admin': 'invalid'},
{'dst': '956', 'object': 'Lok. Certification', 'admin': 'valid'}]],
[13,'wXB', [{'dst': '986', 'object': 'Fral_heater', 'admin': 'valid'},
{'dst': '987', 'object': 'Fral_cond.', 'admin': 'valid'}]],
])
第 2 列中的每个列表都具有完全相同的键(dst
、object
和 admin
)。
df0
的每一行可以有 0(空 []
)到 100 个列表。
我希望我可以扩展 df0
DataFrame 看起来像这样:
columns = ['id', 'name', 'dst', 'object', 'admin']
df_wanted
Out[416]:
id name dst object admin
12 None 925 'Lok. Certification' 'valid'
12 None 935 'Lok. Administration' 'true'
12 None 944 'Lok. Customer' 'false'
12 None 945 'Lok. Customer' 'false'
12 None 955 'Lok. Certification-C' 'invalid'
12 None 956 'Lok. Certification' 'valid'
13 wXB 987 'Lok. Fral_heater' 'valid'
13 wXB 986 'Lok. Fral_cond.' 'valid'
...
请注意,前两列 id
和 name
沿行复制以适应其列表中的元素数量。
(dst
列必须在最后使用 .astype(int)
强制转换为 int
。)
我怎样才能做到这一点?
信息:
Python 3.10.4
pd.__version__
'1.4.2'
最佳答案
您可以先explode
列,然后将字典转换为列:
df0 = df0.explode(2, ignore_index=True)
df0 = pd.concat([df0, df0[2].apply(pd.Series)], axis=1).drop(columns=2)
关于python - 将 DataFrame 中的嵌入字典列表展开为 DataFrame 的新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72163253/