拆分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中不同列中列内的字典列表的主要内容,如果未能解决你的问题,请参考以下文章

Flutter中列内的容器之间不需要的间距

将列表转换为 DataFrame 并在 DataFrame 列中拆分嵌套字典 - Python 3.6

将3个列表解析为python中的字典列表

fread指定列内的分隔符

如何根据oracle plsql中列中的逗号分隔值拆分选择查询行

BigQuery 将“字节”列拆分为行