基于列与行索引合并两个Pandas DataFrame的实现方案咨询
Pandas DataFrame 合并实现方案
你要实现的效果本质是将长结构的df1转换为宽结构,直接用pivot方法即可完成,不需要依赖df2,如果需要对齐df2的列结构也可以通过关联合并实现。
首先确认已导入pandas库:
import pandas as pd
你给出的示例df1、df2构造代码:
# 构造df1 lst=[[1,'Stocks',0.5],[1,'Bonds',0.5],[2,'Stocks',0.3],[2,'Bonds',0.3],[2,'AI',0.4]] df1=pd.DataFrame(lst,columns=['PfNr','AK','Wght']) # 构造df2 lst=[[1,'NaN','NaN','NaN'],[2,'NaN','NaN','NaN']] df2=pd.DataFrame(lst,columns=['PfNr','Bonds','Stocks','AI'])
方法1:直接转换df1得到目标df3(无需使用df2)
# 透视长表转宽表 df3 = df1.pivot(index='PfNr', columns='AK', values='Wght').reset_index() # 清除列索引名称 df3.columns.name = None # 空值替换为字符串'NaN',和你给出的目标格式一致 df3 = df3.fillna('NaN') # 调整列顺序匹配目标df3 df3 = df3[['PfNr', 'Bonds', 'Stocks', 'AI']]
方法2:结合df2合并(适用于df2存在其他需要保留的列的场景)
# 先把df1转成宽表 df1_wide = df1.pivot(index='PfNr', columns='AK', values='Wght').reset_index() df1_wide.columns.name = None # 以PfNr为关联键和df2合并,用df1的数值填充df2的空值 df3 = df2[['PfNr']].merge(df1_wide, on='PfNr', how='left').fillna('NaN')
注意事项
- 如果你的实际业务场景中,同一个PfNr和AK组合存在多个重复值,需要替换pivot为pivot_table方法,指定aggfunc参数做聚合,比如求和
aggfunc='sum'、取均值aggfunc='mean'等,避免报错。
执行print(df3)即可得到和需求一致的结果:
PfNr Bonds Stocks AI 0 1 0.5 0.5 NaN 1 2 0.3 0.3 0.4
内容的提问来源于stack exchange,提问作者Bsleon
相关产品推荐
相关产品推荐

