Python:Pandas 数据框,merge/join 不同键上的表

Python: Pandas dataframe, merge/join tabels on different keys

我有 3 个 table 如下形式:

import pandas as pd

df1 = pd.DataFrame({'ISIN': [1, 4, 7, 10],
                   'Value1': [2012, 2014, 2013, 2014],
                   'Value2': [55, 40, 84, 31]})
df1 = df1.set_index("ISIN")

df2 = pd.DataFrame({'ISIN': [1, 4, 7, 10],
                   'Symbol': ['a', 'b', 'c', 'd']})
df2 = df2.set_index("ISIN")

df3 = pd.DataFrame({'Symbol': ['a', 'b', 'c', 'd'],
                    '01.01.2020': [1, 2, 3, 4],
                    '01.01.2021': [3,2,3,2]})
df3 = df3.set_index("Symbol")

我现在的目标是将所有 3 个表格合并在一起。我会采用以下方式:

第一步(合并 df1 和 df2):

result1 = pd.merge(df1, df2, on=["ISIN"])
print(result1)

结果没问题,给了我 table:

      Value1  Value2 Symbol
ISIN                       
1       2012      55      a
4       2014      40      b
7       2013      84      c
10      2014      31      d

下一步我想将它与 df3 合并,所以我在 df2 和 df3 之间做了一步合并:

print(result1)
result2 = pd.merge(df2, df3, on=["Symbol"])
print(result2)

我现在的问题,输出是:

  Symbol  01.01.2020  01.01.2021
0      a           1           3
1      b           2           2
2      c           3           3
3      d           4           2

此处的 ISIN 列已丢失。而步骤

result = pd.merge(result, result2, on=["ISIN"])
result.set_index("ISIN")

产生错误。

有没有一种优雅的方法可以将这 3 个表合并在一起(使用键列 ISIN),为什么键列在第二次合并过程中丢失了?

只需链接 merge 操作:

result = df1.merge(df2.reset_index(), on='ISIN').merge(df3, on='Symbol')

或者使用您的语法,使用 result1 作为第二次合并的来源:

result1 = pd.merge(df1, df2.reset_index(), on=["ISIN"])
result2 = pd.merge(result1, df3, on=["Symbol"])

输出:

   ISIN  Value1  Value2 Symbol  01.01.2020  01.01.2021
0     1    2012      55      a           1           3
1     4    2014      40      b           2           2
2     7    2013      84      c           3           3
3    10    2014      31      d           4           2

如果您希望将索引作为数据的一部分保留在数据框中,则不应在加入之前设置索引。我建议先合并,然后将索引设置为您想要的值。在一行中:

output = df1.merge(df2,on='ISIN').merge(df3,on='Symbol')

输出:

   ISIN  Value1  Value2 Symbol  01.01.2020  01.01.2021
0     1    2012      55      a           1           3
1     4    2014      40      b           2           2
2     7    2013      84      c           3           3
3    10    2014      31      d           4           2

您现在可以通过将 .set_index('ISIN') 添加到输出来将索引设置为 ISIN

      Value1  Value2 Symbol  01.01.2020  01.01.2021
ISIN                                               
1       2012      55      a           1           3
4       2014      40      b           2           2
7       2013      84      c           3           3
10      2014      31      d           4           2