我有两个数据框,我想在多个索引列上合并/加入,但我不确定该怎么做。
我的第一个数据框如下所示:
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'Type': np.repeat(['A', 'B', 'C'], 6),
'Date': np.repeat(pd.date_range(start='2014-01-01', end='2014-01-30', freq='3D')[:-1], 2),
'var1': np.random.randn(18),
'var2': np.random.randn(18)})
df1
Out[1]:
Type Date var1 var2
0 A 2014-01-01 1.158068 -0.010431
1 A 2014-01-01 0.052350 0.779531
2 A 2014-01-04 0.321079 -2.103932
3 A 2014-01-04 -0.796583 0.528920
4 A 2014-01-07 -0.868004 -0.170354
5 A 2014-01-07 -1.090472 -0.116811
6 B 2014-01-10 -0.659798 3.390008
7 B 2014-01-10 -1.054428 0.016943
8 B 2014-01-13 0.853301 0.292624
9 B 2014-01-13 0.814400 -1.213494
10 B 2014-01-16 0.307140 1.866017
11 B 2014-01-16 0.652235 0.431757
12 C 2014-01-19 1.030088 0.646554
13 C 2014-01-19 0.163201 0.974505
14 C 2014-01-22 0.517568 -0.197154
15 C 2014-01-22 -1.252889 0.335804
16 C 2014-01-25 -1.670459 1.335267
17 C 2014-01-25 -0.504036 -1.966568
此处 Date
列中的日期不是唯一的,即使在同一 Type
中它们也可以出现多次。
我的第二个就像一个“查找表”,用于将更多变量填充到 df1
中。 Date
在此处的 Type
中是唯一的(但每种类型都有一个日期)。在这里:
dates = df1.Date.unique()
df2 = pd.DataFrame({'Type': np.repeat(['A', 'B', 'C'], len(dates)),
'Date': np.tile(dates, 3),
'var3': np.random.randn(len(dates)*3),
'var4': np.random.randn(len(dates)*3)})
df2
Out[2]:
Type Date var3 var4
0 A 2014-01-01 -1.174070 -0.385655
1 A 2014-01-04 0.297007 0.993622
2 A 2014-01-07 0.022896 0.273704
3 A 2014-01-10 -1.392180 -1.100206
4 A 2014-01-13 -0.681359 2.784101
5 A 2014-01-16 0.228933 0.699884
6 A 2014-01-19 -1.048384 0.649192
7 A 2014-01-22 -1.873971 2.479376
8 A 2014-01-25 0.765804 0.579625
9 B 2014-01-01 -0.274890 0.000616
10 B 2014-01-04 -0.962112 -0.165101
11 B 2014-01-07 1.547124 -0.988169
12 B 2014-01-10 0.140017 2.038517
13 B 2014-01-13 0.436132 -0.727510
14 B 2014-01-16 0.490690 -0.461119
15 B 2014-01-19 0.660947 0.962961
16 B 2014-01-22 -1.153902 0.436929
17 B 2014-01-25 -0.171737 -2.704890
18 C 2014-01-01 0.153577 0.261392
19 C 2014-01-04 0.367761 0.899686
20 C 2014-01-07 -1.766651 0.286800
21 C 2014-01-10 -0.536036 0.322947
22 C 2014-01-13 -1.517577 3.400519
23 C 2014-01-16 0.271890 0.460464
24 C 2014-01-19 1.590970 0.380616
25 C 2014-01-22 0.693004 -0.647738
26 C 2014-01-25 0.797017 0.642877
那么我现在要做的是:
- 对每一行取
df1
: - 在
df2
中查找对应的['Type', 'Date']
-Combination - 在df1中填入相应的
var3
和var4
值。
我通常使用 df1.join(df2, on=['Type', 'Date'])
执行此类操作。但由于某种原因它抛出
ValueError: len(left_on) must equal the number of levels in the index of "right"
不确定这里的问题是什么,或者如何以更简单的方式做到这一点
最佳答案
关于python - Pandas :具有多个索引列的复杂合并操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57254426/