python - Pandas :具有多个索引列的复杂合并操作

标签 python pandas merge

我有两个数据框,我想在多个索引列上合并/加入,但我不确定该怎么做。

我的第一个数据框如下所示:

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

那么我现在要做的是:

  1. 对每一行取 df1:
  2. df2中查找对应的['Type', 'Date']-Combination
  3. 在df1中填入相应的var3var4值。

我通常使用 df1.join(df2, on=['Type', 'Date']) 执行此类操作。但由于某种原因它抛出

ValueError: len(left_on) must equal the number of levels in the index of "right"

不确定这里的问题是什么,或者如何以更简单的方式做到这一点

最佳答案

你可能正在寻找merge

df2.merge(df1, on = ['Type', 'Date'], how = 'right')

不加入索引时使用合并更方便,查看this回复更多详情

关于python - Pandas :具有多个索引列的复杂合并操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57254426/

相关文章:

python - 如何从 Vispy 中的屏幕坐标获取世界坐标

Python Pandas - 连接两个具有不同行数和列数的数据框

python - Pandas 面试问题 - 比较 Pandas-Joins 并理想地提供最快的方法

github - 使用 Github repo 将分支与 Pycharm 合并

sql - 合并具有相同列名的两个表,添加计数器

python - 基于 bool 函数合并 Pandas Dataframe

python - 如何使用pybind11在c++中调用python内置函数

python - 用python替换字符串中的子字符串

python - 如果我知道第一个字段值,如何从模型中获取另一个字段值?

python - 标记重复行并为重复行添加范围编号,Python 3.6