从Pandas DataFrame嵌套字典中提取值并转换格式
处理嵌套字典提取值并转换Pandas DataFrame格式
原始DataFrame
| Name | A | B |
|---|---|---|
| $overall | {'all': 26929} | {'all': 2036} |
| QWE | {'$overall': {'all': 6},'Mar 18, 2021': {'all': 3},'Mar 3, 2021': {'all': 3}} | {'$overall': {'all': 3},'Mar 3, 2021': {'all': 2},'Mar 18, 2021': {'all': 1}} |
期望输出
| Name | Date | A | B |
|---|---|---|---|
| $overall | 26929 | 2036 | |
| QWE | Mar 3, 2021 | 3 | 2 |
| QWE | Mar 18, 2021 | 3 | 1 |
尝试的代码及错误输出
尝试使用以下代码提取值:
df = df.apply(lambda s: s.str['all']).fillna(0).convert_dtypes()
得到错误输出:
| Name | A | B |
|---|---|---|
| $overall | 26929 | 2036 |
| QWE | 0 | 0 |
| QWE | 0 | 0 |
df.to_dict()返回结果:
{ 'A': { '$XYZ': {'all': 26929}, 'QWE': { '$overall': {'all': 6}, 'Mar 18, 2021': {'all': 3}, 'Mar 3, 2021': {'all': 3} } }, 'B': { '$XYZ': {'all': 2036}, 'QWE': { '$overall': {'all': 3}, 'Mar 3, 2021': {'all': 2}, 'Mar 18, 2021': {'all': 1} } }, 'Name': { '$XYZ': '$overall', 'QWE': 'QWE' } }
解决方法
通过遍历每行数据,区分处理汇总行和带日期的行,提取对应值并构造目标结构:
import pandas as pd # 构造原始DataFrame(可替换为实际数据) data = { 'Name': ['$overall', 'QWE'], 'A': [{'all': 26929}, {'$overall': {'all': 6}, 'Mar 18, 2021': {'all': 3}, 'Mar 3, 2021': {'all': 3}}], 'B': [{'all': 2036}, {'$overall': {'all': 3}, 'Mar 3, 2021': {'all': 2}, 'Mar 18, 2021': {'all': 1}}] } df = pd.DataFrame(data) result_rows = [] for idx, row in df.iterrows(): name = row['Name'] a_dict = row['A'] b_dict = row['B'] if name == '$overall': # 处理汇总行,直接提取all值 result_rows.append({ 'Name': name, 'Date': '', 'A': a_dict['all'], 'B': b_dict['all'] }) else: # 处理带日期的行,排除$overall键,展开每个日期 date_keys = [k for k in a_dict.keys() if k != '$overall'] for date in date_keys: result_rows.append({ 'Name': name, 'Date': date, 'A': a_dict[date]['all'], 'B': b_dict[date]['all'] }) # 生成目标DataFrame final_df = pd.DataFrame(result_rows) print(final_df)
执行后即可得到期望的输出格式。
内容的提问来源于stack exchange,提问作者SSD
相关产品推荐
相关产品推荐

