Pandas在多个索引上加入,标准在一个级别上

2024-09-30 11:30:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我用3个级别对df1进行了索引,并用相同的3个级别对df2进行了索引。 让我们假设date,name,criteria是这两个数据帧的索引所依据的3列

我想将df2连接到df1,这样对于df1中的每一级索引a_date,a_name,a_criteria,从df2连接的值与a_date,a_name,specific_criteria匹配,其中specific_criteria是一个常量值

我最后做了下面的事情,想知道是否有更优雅的方式

new_df1= pd.DataFrame()
for group_name, group_df in df1.groupby(level=[0, 1]):
    index_level = group_name + ("0M","field_v1",)
    group_df["bla2"] = df2.loc[index_level, "bla2"]
    new_df1 = pd.concat([new_df1, group_df])


样本数据:

df1:

date    asset   tenor   bla value
1/3/2005    AEX 12M 100 0.155346154
1/3/2005    AEX 12M 102.5   0.150401253
1/3/2005    AEX 12M 105 0.142983901
1/3/2005    AEX 12M 107.5   0.137154123
1/3/2005    AEX 12M 110 0.133267604
1/3/2005    AEX 6M  112.5   0.130425064
1/3/2005    AEX 6M  115 0.126161253
1/3/2005    AEX 6M  117.5   0.12344318
1/3/2005    AEX 6M  120 0.121631132
1/3/2005    AEX 6M  80  0.210254154

df2:

tenor   field   bla2    date
0M  field_v1    351.91  1/3/2005
0M  field_v2    351.91  1/3/2005
0M  field_v3    347.7   1/3/2005

我想为df1中的所有(1/3/2005,AEX)(1/3/2005,AEX,0M,field_v1")获取以下result_df1bla2)值(351.91):

date    asset   tenor   bla value   bla2
1/3/2005    AEX 12M 100 0.155346154 351.91
1/3/2005    AEX 12M 102.5   0.150401253 351.91
1/3/2005    AEX 12M 105 0.142983901 351.91
1/3/2005    AEX 12M 107.5   0.137154123 351.91
1/3/2005    AEX 12M 110 0.133267604 351.91
1/3/2005    AEX 6M  112.5   0.130425064 351.91
1/3/2005    AEX 6M  115 0.126161253 351.91
1/3/2005    AEX 6M  117.5   0.12344318  351.91
1/3/2005    AEX 6M  120 0.121631132 351.91
1/3/2005    AEX 6M  80  0.210254154 351.91

Tags: namefielddfnewdategroup级别level
2条回答

如果它对某人有用,你实际上可以这样做

df1["tenor2"] = "0M"
df1["field"] = "field_v1"
df1.set_index(["date","tenor2","field"]
df2.set_index(["date","tenor","field"]
df1.join(df2)

编辑:@jezrael提供的更好的解决方案

对于我来说,通过^{}^{}进行过滤:

df22 = df2.xs(('0M','field_v1'), level=[2,3])
new_df1 = df1.join(df22)

相关问题 更多 >

    热门问题