python中不同列中列内字典的拆分列表
我有一个这样的数据帧python中不同列中列内字典的拆分列表,python,python-3.x,pandas,dictionary,Python,Python 3.x,Pandas,Dictionary,我有一个这样的数据帧 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
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
编辑1:
可能存在列值为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
列1列2键列2值列3键列3值
0 1 A
1 2 B A A
使用列表理解
获取字典值和COL:
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
你可以用
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
您可以尝试:
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
如果我有一列的列表为空,解决方案就会失败,对吗?检查我的edit@Hardikgupta我把它添加到了答案中。如果我有一个空列表的列,解决方案就会失败,对吗?检查我的edit@Hardikgupta:是的,会的。但是我在
splitter
函数中添加了一个try/except
块,这应该可以解释这一点。如果我有一个空列表的列,解决方案就会失败,对吗?检查我的编辑