熊猫groupby merge_asof

ip

我有两个数据框leftright并且我想根据中的分组进行合并df1

df1:

ID              cumul_growth_perc
Nioz-TC-09-A1R  0
Nioz-TC-09-A1R  2.99881756777804
Nioz-TC-09-A1R  90.1974001442841
Nioz-TC-09-A1R  92.7010664317585
Nioz-TC-09-A1R  95.4937993952028
Nioz-TC-09-A1R  97.7300790074048
Nioz-TC-09-A1R  100
Nioz-TC-09-A2R  0
Nioz-TC-09-A2R  2.1989297984251
Nioz-TC-09-A2R  4.25561486642024
Nioz-TC-09-A2R  82.2910739802899
Nioz-TC-09-A2R  93.276493352502
Nioz-TC-09-A2R  95.5072381936874
Nioz-TC-09-A2R  97.5983443147713
Nioz-TC-09-A2R  100
df2:

day cumul_growth_perc
32  0.233297611918821
33  0.466595223837642
34  0.699892835756464
35  0.933190447675285
36  1.16648805959411
37  1.39978567151293
46  3.54027808151455
47  3.78173847397982
48  4.02319886644508
335 92.4313101347799
336 92.6888317371006
337 92.9463533394213
338 93.203874941742
339 93.4613965440627
340 93.7189181463834
361 99.0468989121531
362 99.2851741841149
363 99.5234494560766
364 99.7617247280384
365 100

cumul_growth_perc范围从0到100,但此处缩短以进行演示。我想在此列合并两个dataframes和值不完全匹配df1df2此外,在执行匹配之前df1应按该ID分组据我了解,pandasmerge_asof特别具有by=关键字来执行此操作。但由于我没有IDdf2,因此操作失败。df2对的所有组都是相同的df1

这是我使用的: pd.merge_asof(df1, df2, on='cumul_growth_perc', left_by='ID', direction='nearest')

不出所料,它告诉我right_by is missing我如何仍然可以执行“分组合并”?我可以df2通过为中的每个唯一值附加相同的值来进行扩展df1.ID,但这感觉很麻烦。

编辑:

预期产量:

                ID  cumul_growth_perc  day
0   Nioz-TC-09-A1R           0.000000   32
1   Nioz-TC-09-A1R           2.998818   46
2   Nioz-TC-09-A1R          90.197400  335
3   Nioz-TC-09-A1R          92.701066  336
4   Nioz-TC-09-A1R          95.493799  340
5   Nioz-TC-09-A1R          97.730079  361
6   Nioz-TC-09-A1R         100.000000  365
7   Nioz-TC-09-A2R           0.000000   32
8   Nioz-TC-09-A2R           2.198930   37
9   Nioz-TC-09-A2R           4.255615   48
10  Nioz-TC-09-A2R          82.291074  335
11  Nioz-TC-09-A2R          93.276493  338
12  Nioz-TC-09-A2R          95.507238  340
13  Nioz-TC-09-A2R          97.598344  361
14  Nioz-TC-09-A2R         100.000000  365

意思是我想df1.ID在执行合并之前分组我通过“重复”每个ID的df2附加ID列来使其工作df1

for i, name in enumerate(df1.Shell_ID.unique()):
    if i==0:
        df2_long = df2.copy()
        df2_long['ID'] = name
    else:
        temp = df2.copy()
        temp['ID'] = name
        df2_long = df2_long.append(temp)

然后将两个数据框排序,cumul_growth_perc然后将它们合并pd.merge_asof(df1, df2_long, on='cumul_growth_perc', by='ID', direction='nearest')

但是感觉好像有一个更简单的解决方案。

Shubham Sharma

使用DataFrame.sort_values排序dataframesdf1df2cumul_growth_perc随后进行merge_asof的排序dataframes:

d1 = df1.sort_values('cumul_growth_perc')
d2 = df2.sort_values('cumul_growth_perc')

df = pd.merge_asof(d1, d2, on='cumul_growth_perc', direction='nearest').sort_values('ID')

结果:

                ID  cumul_growth_perc  day
0   Nioz-TC-09-A1R           0.000000   32
1   Nioz-TC-09-A1R           2.998818   46
2   Nioz-TC-09-A1R          90.197400  335
3   Nioz-TC-09-A1R          92.701066  336
4   Nioz-TC-09-A1R          95.493799  340
5   Nioz-TC-09-A1R          97.730079  361
6   Nioz-TC-09-A1R         100.000000  365
7   Nioz-TC-09-A2R           0.000000   32
8   Nioz-TC-09-A2R           2.198930   37
9   Nioz-TC-09-A2R           4.255615   48
10  Nioz-TC-09-A2R          82.291074  335
11  Nioz-TC-09-A2R          93.276493  338
12  Nioz-TC-09-A2R          95.507238  340
13  Nioz-TC-09-A2R          97.598344  361
14  Nioz-TC-09-A2R         100.000000  365

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章