根据两列的比较连接数据框
Joining dataframes based on the comparison of two columns
我的出发点是这样的
import pandas as pd
dx = {
'bezeichnung': ['Erlöse' , 'Aufwand' , 'Material_19' , 'Gewinn'] ,
'2020': ['1001' , '900' , '90' , '11']
}
dx = {
'bezeichnung': ['Aufwand' , 'Erlöse' , 'Material_16' , 'Gewinn'] ,
'2019': ['1900' , '2001' , '80' , '21']
}
df1 = pd.DataFrame(dx)
df2 = pd.DataFrame(dy)
我基本上想要以下内容:
- 比较名为 'bezeichnung' 的列。如果两列中的元素相等,则在新列“2019”中添加“2019”的相应值,该列应添加到 df1 或新的 df3。
- 如果df2中'bezeichnung'的元素在df1中找不到,则在df1中添加'bezeichnung'列末尾的元素,并将df2中对应的值'2019'放入添加的列“2019”(见上文)。
- 保持 df1 中 'bezeichnung' 列的顺序很重要。
结果应该是这样的:
df1 = pd.DataFrame('bezeichnung': ['Erlöse' , 'Aufwand' , 'Material_19' , 'Gewinn', 'Material_16'] ,
'2020': ['1001' , '900' , '90' , '11', '0'] ,
'2019': ['2001' , '1900' , '0' , '21', '80'])
非常感谢!
当行中没有匹配值时,您可以使用 outer merge
将左右数据帧的所有行与 NaN
组合。对于您的情况,我将其更改为字符串 '0'
。更改 indicator=True
以在附加列名称 _merge
中查看两个数据帧之间的差异
import pandas as pd
import numpy as np
dx = {
'bezeichnung': ['Erlöse' , 'Aufwand' , 'Material_19' , 'Gewinn'] ,
'2020': ['1001' , '900' , '90' , '11']
}
dy = {
'bezeichnung': ['Aufwand' , 'Erlöse' , 'Material_16' , 'Gewinn'] ,
'2019': ['1900' , '2001' , '80' , '21']
}
# your expected results
df = pd.DataFrame({'bezeichnung': ['Erlöse' , 'Aufwand' , 'Material_19' , 'Gewinn', 'Material_16'] ,
'2020': ['1001' , '900' , '90' , '11', '0'] ,
'2019': ['2001' , '1900' , '0' , '21', '80']})
df1 = pd.DataFrame(dx)
df2 = pd.DataFrame(dy)
col = 'bezeichnung'
temp = pd.merge(df1, df2, on=col, how='outer', indicator=False)
temp = temp.replace(np.nan, '0')
# you can check if two dfs are equal
if temp.equals(df):
print('Two dfs are equal.\n')
print(temp)
输出:
Two dfs are equal.
bezeichnung 2020 2019
0 Erlöse 1001 2001
1 Aufwand 900 1900
2 Material_19 90 0
3 Gewinn 11 21
4 Material_16 0 80
我的出发点是这样的
import pandas as pd
dx = {
'bezeichnung': ['Erlöse' , 'Aufwand' , 'Material_19' , 'Gewinn'] ,
'2020': ['1001' , '900' , '90' , '11']
}
dx = {
'bezeichnung': ['Aufwand' , 'Erlöse' , 'Material_16' , 'Gewinn'] ,
'2019': ['1900' , '2001' , '80' , '21']
}
df1 = pd.DataFrame(dx)
df2 = pd.DataFrame(dy)
我基本上想要以下内容:
- 比较名为 'bezeichnung' 的列。如果两列中的元素相等,则在新列“2019”中添加“2019”的相应值,该列应添加到 df1 或新的 df3。
- 如果df2中'bezeichnung'的元素在df1中找不到,则在df1中添加'bezeichnung'列末尾的元素,并将df2中对应的值'2019'放入添加的列“2019”(见上文)。
- 保持 df1 中 'bezeichnung' 列的顺序很重要。
结果应该是这样的:
df1 = pd.DataFrame('bezeichnung': ['Erlöse' , 'Aufwand' , 'Material_19' , 'Gewinn', 'Material_16'] ,
'2020': ['1001' , '900' , '90' , '11', '0'] ,
'2019': ['2001' , '1900' , '0' , '21', '80'])
非常感谢!
当行中没有匹配值时,您可以使用 outer merge
将左右数据帧的所有行与 NaN
组合。对于您的情况,我将其更改为字符串 '0'
。更改 indicator=True
以在附加列名称 _merge
import pandas as pd
import numpy as np
dx = {
'bezeichnung': ['Erlöse' , 'Aufwand' , 'Material_19' , 'Gewinn'] ,
'2020': ['1001' , '900' , '90' , '11']
}
dy = {
'bezeichnung': ['Aufwand' , 'Erlöse' , 'Material_16' , 'Gewinn'] ,
'2019': ['1900' , '2001' , '80' , '21']
}
# your expected results
df = pd.DataFrame({'bezeichnung': ['Erlöse' , 'Aufwand' , 'Material_19' , 'Gewinn', 'Material_16'] ,
'2020': ['1001' , '900' , '90' , '11', '0'] ,
'2019': ['2001' , '1900' , '0' , '21', '80']})
df1 = pd.DataFrame(dx)
df2 = pd.DataFrame(dy)
col = 'bezeichnung'
temp = pd.merge(df1, df2, on=col, how='outer', indicator=False)
temp = temp.replace(np.nan, '0')
# you can check if two dfs are equal
if temp.equals(df):
print('Two dfs are equal.\n')
print(temp)
输出:
Two dfs are equal.
bezeichnung 2020 2019
0 Erlöse 1001 2001
1 Aufwand 900 1900
2 Material_19 90 0
3 Gewinn 11 21
4 Material_16 0 80