如何从Pandas DataFrame的嵌套字典中提取值并转换格式
问题描述
我有如下Pandas 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}} |
期望转换为如下格式的DataFrame:
| Name | Date | A | B |
|---|---|---|---|
| XYZ | 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 |
|---|---|---|
| XYZ | 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为df result = [] for idx, row in df.iterrows(): current_name = row['Name'] # 处理对应XYZ的行(原Name为$overall) if current_name == '$overall': a_val = row['A']['all'] b_val = row['B']['all'] result.append({'Name': 'XYZ', 'Date': '', 'A': a_val, 'B': b_val}) else: # 处理QWE行,过滤掉$overall键,只保留日期相关数据 target_dates = [key for key in row['A'].keys() if key != '$overall'] for date in target_dates: a_val = row['A'][date]['all'] b_val = row['B'][date]['all'] result.append({'Name': current_name, 'Date': date, 'A': a_val, 'B': b_val}) # 转换为目标DataFrame final_df = pd.DataFrame(result)
运行上述代码后,即可得到符合预期格式的DataFrame。
内容的提问来源于stack exchange,提问作者SSD
相关产品推荐
相关产品推荐

