【问题标题】:Expanding an array of dictionary pandas扩展字典熊猫数组
【发布时间】:2019-08-06 04:24:21
【问题描述】:

所以我有一个 pandas 数据框,其中包含一个字典数组,我正在努力解决如何将这些转换为原始字典中的列。

df3 = pd.DataFrame({'SomeCol':
                        ["[{'Source': 'A', 'Value': '4.7'}]",
                         "[{'Source': 'A', 'Value': '8.2'},"
                         "{'Source': 'B', 'Value': '100%'}]",
                         "[{'Source': 'A', 'Value': '8.1'}, "
                         "{'Source': 'C', 'Value': '870'},"
                         "{'Source': 'B', 'Value': '98%'}]",
                         "[{}]"
                         ],
                    'Other Stuff': ['One'
                        , 'Two', 'Three', 'Four'
                                    ]
                    })

我希望得到以下结果

    A      B      C
0   4.7     na    na
1   8.2    100%   na
2   8.1     98%   870

我试过了

data.map(eval).apply(pd.Series)

以及主题的许多变体

def f2(x):
    df_r = pd.DataFrame()
    for i in x:
        df_r = pd.DataFrame.from_dict(x, orient='columns')
    return df_r

dfa = pd.concat([df3, df3['SomeCol'].map(eval).apply(f2)])

我似乎遗漏了一些重要的东西。离我最近的是

第一次调用f2函数的结果接近

    Source    Value
0    A        4.7

0    A        8.2
1    B       100%

0    A        8.1
1    C        870
2    B        98%

但是当我将它们连接在一起时,我会变得一团糟。只是一些关于从这里去哪里的帮助会很有帮助。在过去的两天里,我一直在用一种简单的方法以及一种蛮力来挣扎,而neigher 似乎可以解决它。

【问题讨论】:

  • 解决方案很简单,请检查一下。

标签: python arrays pandas dictionary


【解决方案1】:

您可以使用ast.literal_eval 创建字典以将字符串转换为字典:

import ast

out = [{x.get('Source'):x.get('Value') for x in ast.literal_eval(v)} 
                for k, v in df3.pop('SomeCol').items()]
print (out)
[{'A': '4.7'}, {'A': '8.2', 'B': '100%'}, {'A': '8.1', 'C': '870', 'B': '98%'}, {None: None}]

然后传递给DataFrame 构造函数并通过DataFrame.dropna 删除NaNs 列:

df = pd.DataFrame(out, index=df3.index).dropna(how='all', axis=1)
print (df)
     A     B    C
0  4.7   NaN  NaN
1  8.2  100%  NaN
2  8.1   98%  870
3  NaN   NaN  NaN

最后DataFrame.join 到原来的:

df = df3.join(df)
print (df)
  Other Stuff    A     B    C
0         One  4.7   NaN  NaN
1         Two  8.2  100%  NaN
2       Three  8.1   98%  870
3        Four  NaN   NaN  NaN

【讨论】:

  • 太棒了!效果很好。 .pop.items() 是怎么回事?我不明白这是个人喜好,还是选择 pop 而不是仅仅迭代列中的项目有什么相关性?
猜你喜欢
  • 2019-07-30
  • 2018-05-09
  • 2018-11-21
  • 2022-11-10
  • 2023-02-25
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 2016-10-17
相关资源
最近更新 更多