如何用Pandas从字典列提取数据更新DataFrame的空字典列Fee_info?
Pandas从字典列提取指定键值对更新目标列
问题描述
现有Pandas DataFrame,其中Fee_detail列的值为字典类型,Fee_info列默认是空字典。需要从Fee_detail的字典中提取date和penalty的键值对,更新到Fee_info列中,同时将date格式化为dd-mm-yyyy的字符串形式。
数据构造代码
import pandas as pd import datetime d = {'Fee_detail': [{'date':'datetime.datetime(2022, 5, 5, 7, 31)', 'Fees':1200, 'penalty':0}, {'date':'datetime.datetime(2022, 5, 7, 7, 31)', 'Fees':1000, 'penalty':10}, {'date':'datetime.datetime(2022, 5, 11, 7, 31)', 'Fees':800,'penalty':50}], 'Name': ["Adam", "Laura","Andrew"], 'Fee_info':[{},{},{}]} df = pd.DataFrame(data=d)
原始DataFrame
| Fee_detail | Name | Fee_info |
|---|---|---|
| {'date':'datetime.datetime(2022, 5, 5, 7, 31)', 'Fees':1200, 'penalty':0} | Adam | {} |
| {'date':'datetime.datetime(2022, 5, 7, 7, 31)', 'Fees':1000, 'penalty':10} | Laura | {} |
| {'date':'datetime.datetime(2022, 5, 11, 7, 31)', 'Fees':800,'penalty':50} | Andrew | {} |
期望输出
| Fee_detail | Name | Fee_detail |
|---|---|---|
| {'date':'datetime.datetime(2022, 5, 5, 7, 31)', 'Fees':1200, 'penalty':0} | Adam | {'date': '05-05-2022','penalty':0} |
| {'date':'datetime.datetime(2022, 5, 7, 7, 31)', 'Fees':1000, 'penalty':10} | Laura | {'date': '07-05-2022','penalty':10} |
| {'date':'datetime.datetime(2022, 5, 11, 7, 31)', 'Fees':800,'penalty':50} | Andrew | {'date': '11-05-2022', 'penalty':50} |
解决方案
通过apply方法结合自定义函数实现,核心步骤是解析日期字符串、格式化日期,再构造目标字典更新Fee_info列。
完整实现代码
import pandas as pd import datetime def update_fee_info(row): # 安全解析日期字符串(替代eval,避免不可信数据风险) date_raw = row['Fee_detail']['date'].replace('datetime.datetime(', '').replace(')', '') year, month, day, _, _ = map(int, date_raw.split(',')) date_obj = datetime.datetime(year, month, day) # 格式化为dd-mm-yyyy字符串 formatted_date = date_obj.strftime('%d-%m-%Y') # 构造要更新的键值对并合并到Fee_info row['Fee_info'].update({ 'date': formatted_date, 'penalty': row['Fee_detail']['penalty'] }) return row # 应用函数到每一行 df = df.apply(update_fee_info, axis=1) # 查看结果 print(df)
关键说明
- 解析日期时,避免使用
eval()处理不可信数据,改用字符串分割提取日期参数的方式更安全; - 使用
strftime('%d-%m-%Y')将datetime对象转换为目标格式的字符串; - 字典的
update()方法会保留Fee_info原有的键值对(如果有),仅新增或覆盖指定的date和penalty。
内容的提问来源于stack exchange,提问作者GeekGroot
相关产品推荐
相关产品推荐

