如何将DataFrame中的值添加到字典内对应的另一个DataFrame中?
解决方案
先把你给出的示例数据明确下(方便复现调试):
import pandas as pd # 初始化你的客户字典 cust_dict = { 'ABC': pd.DataFrame(columns=['Date', 'Particulars', 'Vch No.', 'Outwards', 'Amount']), 'BCD': pd.DataFrame(columns=['Date', 'Particulars', 'Vch No.', 'Outwards', 'Amount']) } # 初始化你的业务数据df df = pd.DataFrame({ 'Date': ['2017-04-01 00:00:00', '2017-04-06 00:00:00', '2017-04-05 00:00:00'], 'Particulars': ['ABC', 'BCD', 'ABC'], 'Vch Type': ['Sales', 'Sales', 'Sales'] })
下面给你两种实用的实现思路,按需选择:
方法一:逐行遍历(适合小规模数据)
逻辑非常直观,就是遍历df的每一行,根据Particulars的值匹配字典里对应的DataFrame,把当前行的Date添加进去:
for _, row in df.iterrows(): cust_name = row['Particulars'] # 先检查字典里是否存在该客户,避免键不存在报错 if cust_name in cust_dict: # 构造要插入的行数据,仅填充Date列,其他列留空 new_row = pd.DataFrame({ 'Date': [row['Date']], 'Particulars': [cust_name], # 可选:如果需要保留客户标识可以加上 'Vch No.': [None], 'Outwards': [None], 'Amount': [None] }) # 用concat合并(替代即将弃用的append方法) cust_dict[cust_name] = pd.concat([cust_dict[cust_name], new_row], ignore_index=True)
执行完后,cust_dict['ABC']会包含两条Date记录,cust_dict['BCD']会有一条,完全符合你的需求。
方法二:分组批量处理(适合大规模数据)
如果你的业务数据量很大,逐行遍历效率会偏低,这时候可以先按客户分组,再批量更新字典里的DataFrame:
# 按Particulars分组,把每个客户的Date整理成列表 grouped_dates = df.groupby('Particulars')['Date'].apply(list).to_dict() for cust_name, dates in grouped_dates.items(): if cust_name in cust_dict: # 批量构造多行数据 new_rows = pd.DataFrame({ 'Date': dates, 'Particulars': [cust_name]*len(dates), 'Vch No.': [None]*len(dates), 'Outwards': [None]*len(dates), 'Amount': [None]*len(dates) }) cust_dict[cust_name] = pd.concat([cust_dict[cust_name], new_rows], ignore_index=True)
这种方法减少了循环次数,效率更高,最终结果和方法一完全一致。
小补充
- 如果你不需要在子DataFrame里保留
Particulars列(毕竟字典键已经是客户名了),可以直接去掉对应的列定义; - 要是不确定字典里是否存在所有客户的键,一定要保留
if cust_name in cust_dict的判断,避免抛出KeyError。
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

