扩展字典熊猫的数组

时间:2019-03-15 06:19:01

标签: python arrays pandas dictionary

因此,我有一个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%

但是当我将它们结合在一起时,我会一团糟。仅提供一些有关从此处出发的帮助会有所帮助。最近两天,我都在用一种简单的方法以及一种蛮力在挣扎,而邻居却似乎在削减它。

1 个答案:

答案 0 :(得分:2)

您可以使用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删除NaN的列:

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