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
我有 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