我正在寻找以下解决方案:我有两个数据框。第一个包含三列'Var'
,'Date'
和'Type'
:
date type var
0 2015-01-01 A 0.014370
1 2015-01-02 A 30.835206
2 2015-01-03 A 60.311195
3 2015-01-04 A 90.716415
4 2015-01-05 A 120.589583
... ... ... ...
85 2015-01-26 C 750.286017
86 2015-01-27 C 780.010769
87 2015-01-28 C 810.491360
88 2015-01-29 C 840.598564
89 2015-01-30 C 870.811063
它充当df2
的查找表。该数据框由一些变量列(此处省略了易读性)以及与{f1中的相同列对应的'Var'
和'Type'
组成。
df2 = pd.DataFrame({'Type': np.random.choice(['A', 'B', 'C'], 10),
'Var': np.random.sample(10) * 800})
Type Var
0 C 317.399765
1 A 774.845006
2 B 260.912633
3 B 170.722395
4 C 433.842763
5 C 626.290970
6 A 347.950419
7 C 770.953878
8 B 477.139350
9 B 134.014690
我现在要获取df2
的每一行,在['Type', 'Var'
中查找df1
]的组合,并在df2
中填写相应的日期值。我通常会使用此操作,并且正在寻找一种快速,简短,简单且“最佳实践”的方法。
为此,我经常使用复杂的argsort构造。 merge_asof()
有时也可以使用,但是大多数时候我只希望填写一列。
我觉得涉及不同类型(以及未排序值)的数据结构使此简单操作变得复杂。欢迎提出任何改进建议:)
答案 0 :(得分:0)
我用以下方法解决了这个问题:
df1 = df1.sort_values(by='Var')
df2 = df2.sort_values(by='Var')
m = pd.merge_asof(df2, df1, on='Var', by='Type', direction='nearest')
这已经很短了,但是如果有更好的解决方案,请告诉我。我忘记了by=
运算符实际上是在对数据进行“分组”。我尝试在on=
中使用多个键,这会引发错误。