拆分python中不同列中列内的字典列表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拆分python中不同列中列内的字典列表相关的知识,希望对你有一定的参考价值。
我有这样的数据帧
data = {'col_1': [1, 2],
'col_2': [[{'KEY': 'A', 'VALUE': 'a'}], [{'KEY': 'B', 'VALUE': 'b'}]],
'col_3': [[{'KEY': 'C', 'VALUE': 'c'}], [{'KEY': 'A', 'VALUE': 'a'}]]}
pd.DataFrame.from_dict(data)
col_1 col_2 col_3
0 1 [{'KEY': 'A', 'VALUE': 'a'}] [{'KEY': 'C', 'VALUE': 'c'}]
1 2 [{'KEY': 'B', 'VALUE': 'b'}] [{'KEY': 'A', 'VALUE': 'a'}]
我想转换每列中的字典列表,这样我得到以下输出
col_1 col_2_KEY col_2_VALUE col_3_KEY col_3_VALUE
0 1 A a C c
1 2 B b A a
EDIT1
可能存在列值为null的情况
data = {'col_1': [1, 2],
'col_2': [[{'KEY': 'A', 'VALUE': 'a'}], [{'KEY': 'B', 'VALUE': 'b'}]],
'col_3': [[{'KEY': 'C', 'VALUE': 'c'}], [{'KEY': 'A', 'VALUE': 'a'}]]}
pd.DataFrame.from_dict(data)
col_1 col_2 col_3
0 1 [{'KEY': 'A', 'VALUE': 'a'}] []
1 2 [{'KEY': 'B', 'VALUE': 'b'}] [{'KEY': 'A', 'VALUE': 'a'}]
预期产出
col_1 col_2_KEY col_2_VALUE col_3_KEY col_3_VALUE
0 1 A a <blank> <blank>
1 2 B b A a
答案
你可以试试:
df = pd.concat([df.drop(['col_2','col_3'], axis=1)
, df['col_2'].apply(lambda x:pd.Series(x[0] if len(x)>0 else {})).rename(columns={'KEY':'col_2_KEY','VALUE':'col_2_VALUE'})
, df['col_3'].apply(lambda x:pd.Series(x[0] if len(x)>0 else {})).rename(columns={'KEY':'col_3_KEY','VALUE':'col_3_VALUE'})
], axis=1)
print(df)
col_1 col_2_KEY col_2_VALUE col_3_KEY col_3_VALUE
0 1 A a C c
1 2 B b A a
另一答案
你可以用
def splitter(item):
try:
d = item[0]
return (d["KEY"], d["VALUE"])
except IndexError:
return (None, None)
for i in [2, 3]:
df["col_{}_KEY".format(i)], df["col_{}_VALUE".format(i)] = df["col_{}".format(i)].apply(splitter)
df.drop("col_{}".format(i), axis=1, inplace=True)
生产
col_1 col_2_KEY col_2_VALUE col_3_KEY col_3_VALUE
0 1 A B C A
1 2 a b c a
另一答案
使用list comprehension
获取字典值,使用drop
获取cols:
cols = ['col_2','col_3']
for col in cols:
df[col+'_KEY'] = [d[0].get('KEY') for d in df[col]]
df[col+'_VALUE'] = [d[0].get('VALUE') for d in df[col]]
df.drop(cols, axis=1, inplace=True)
print(df)
col_1 col_2_KEY col_2_VALUE col_3_KEY col_3_VALUE
0 1 A a C c
1 2 B b A a
更新:
cols = ['col_2','col_3']
for col in cols:
df[col+'_KEY'] = [d[0].get('KEY') if d else '' for d in df[col] ]
df[col+'_VALUE'] = [d[0].get('VALUE') if d else '' for d in df[col]]
df.drop(cols, axis=1, inplace=True)
print(df)
col_1 col_2_KEY col_2_VALUE col_3_KEY col_3_VALUE
0 1 A a
1 2 B b A a
以上是关于拆分python中不同列中列内的字典列表的主要内容,如果未能解决你的问题,请参考以下文章
将列表转换为 DataFrame 并在 DataFrame 列中拆分嵌套字典 - Python 3.6