扩展字典数组

2024-09-28 17:16:20 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个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似乎能做到这一点。你知道吗


Tags: 数据mapsourcedataframepandasdf字典value
1条回答
网友
1楼 · 发布于 2024-09-28 17:16:20

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

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构造函数并通过^{}删除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

最后^{}至原件:

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

相关问题 更多 >