合并两个共享相同列值的数据框
merge two dataframe that share the same column value
我有两个数据框
df1 =
C
L
O
D
LN
M
x
y
z
w
FR
312
73
2021-04-09
1
W
1
0
0
0
FR
312
73
2021-04-09
1
W
0
1
0
0
FR
312
73
2021-04-09
1
W
0
0
1
0
FR
312
73
2021-04-09
3
W
1
0
0
0
FR
312
73
2021-04-09
3
W
0
1
0
0
FR
312
73
2021-04-09
3
W
0
0
1
0
FR
312
73
2021-04-09
4
W
1
0
0
0
FR
312
73
2021-04-09
4
W
0
1
0
0
FR
312
73
2021-04-09
4
W
0
0
1
0
FR
312
73
2021-04-09
5
W
1
0
0
0
FR
312
73
2021-04-09
5
W
0
1
0
0
df2=
C
L
O
D
LN
M
x
y
z
w
FR
312
73
2021-04-09
1
L
1
0
0
1
我想在 C 上连接或合并这 2 个 df |大号 |欧 | D | LN
所需输出=
C
L
O
D
LN
M
x
y
z
w
FR
312
73
2021-04-09
1
W
1
0
0
0
FR
312
73
2021-04-09
1
W
0
1
0
0
FR
312
73
2021-04-09
1
W
0
0
1
0
FR
312
73
2021-04-09
1
L
0
0
0
1
感谢您的帮助
正如我试图在评论中指出的那样,一个可能的解决方案是:
- 复制
df2
,并删除不需要的列(用于合并)
- 在
df2_dupli
和 df1
上使用内部合并
- 可能删除
Nan
行,不确定是否需要此步骤
- 合并
df2
和 df_merge
(concat)
- 利润
# initialize
df1 = pd.DataFrame(data={'A': [1, 2, 3], 'B': ["abc", "abc", "cde"], 'C': [0, 1, 0]})
df2 = pd.DataFrame(data={'A': [1, 2], 'B': ["abc", "abc"], 'C': [5, 5]})
# duplicate and drop
df2_dupli = df2.copy()
df2_dupli = df2_dupli.drop(columns=['C'])
# inner merge
df_merge = pd.merge(df1, df2_dupli, how='inner', left_on=['A','B'], right_on = ['A','B'])
# combine
df_out = pd.concat([df_merge, df2])
>>> df1
A B C
0 1 abc 0
1 2 abc 1
2 3 cde 0
>>> df2
A B C
0 1 abc 5
1 2 abc 5
>>> df_out
A B C
0 1 abc 0
1 2 abc 1
0 1 abc 5
1 2 abc 5
df_out
现在包含 df2
中的所有行,以及 df1
中指定列中与 df2
.
具有相同值的行
您可以设置索引,使其与您要匹配的数据对齐:
df1.set_index(['C','L','O','D','LN'], inplace=True)
df2.set_index(['C','L','O','D','LN'], inplace=True)
然后你可以将两个 dfs 合并成一个包含所有记录的 df
df_concat = pd.concat([df1, df2], axis=0)
剩下的就是找到存在于两个数据帧中的索引,并将其用于连接的 df:
i2keep = set(df1.index.tolist()) and set(df2.index.tolist())
df_concat.loc[i2keep,:].reset_index()
产量
C L O D LN M x y z w
0 FR 312 73 4/9/2021 1 W 1 0 0 0
1 FR 312 73 4/9/2021 1 W 0 1 0 0
2 FR 312 73 4/9/2021 1 W 0 0 1 0
3 FR 312 73 4/9/2021 1 L 1 0 0 1
我有两个数据框 df1 =
C | L | O | D | LN | M | x | y | z | w |
---|---|---|---|---|---|---|---|---|---|
FR | 312 | 73 | 2021-04-09 | 1 | W | 1 | 0 | 0 | 0 |
FR | 312 | 73 | 2021-04-09 | 1 | W | 0 | 1 | 0 | 0 |
FR | 312 | 73 | 2021-04-09 | 1 | W | 0 | 0 | 1 | 0 |
FR | 312 | 73 | 2021-04-09 | 3 | W | 1 | 0 | 0 | 0 |
FR | 312 | 73 | 2021-04-09 | 3 | W | 0 | 1 | 0 | 0 |
FR | 312 | 73 | 2021-04-09 | 3 | W | 0 | 0 | 1 | 0 |
FR | 312 | 73 | 2021-04-09 | 4 | W | 1 | 0 | 0 | 0 |
FR | 312 | 73 | 2021-04-09 | 4 | W | 0 | 1 | 0 | 0 |
FR | 312 | 73 | 2021-04-09 | 4 | W | 0 | 0 | 1 | 0 |
FR | 312 | 73 | 2021-04-09 | 5 | W | 1 | 0 | 0 | 0 |
FR | 312 | 73 | 2021-04-09 | 5 | W | 0 | 1 | 0 | 0 |
df2=
C | L | O | D | LN | M | x | y | z | w |
---|---|---|---|---|---|---|---|---|---|
FR | 312 | 73 | 2021-04-09 | 1 | L | 1 | 0 | 0 | 1 |
我想在 C 上连接或合并这 2 个 df |大号 |欧 | D | LN
所需输出=
C | L | O | D | LN | M | x | y | z | w |
---|---|---|---|---|---|---|---|---|---|
FR | 312 | 73 | 2021-04-09 | 1 | W | 1 | 0 | 0 | 0 |
FR | 312 | 73 | 2021-04-09 | 1 | W | 0 | 1 | 0 | 0 |
FR | 312 | 73 | 2021-04-09 | 1 | W | 0 | 0 | 1 | 0 |
FR | 312 | 73 | 2021-04-09 | 1 | L | 0 | 0 | 0 | 1 |
感谢您的帮助
正如我试图在评论中指出的那样,一个可能的解决方案是:
- 复制
df2
,并删除不需要的列(用于合并) - 在
df2_dupli
和df1
上使用内部合并
- 可能删除
Nan
行,不确定是否需要此步骤 - 合并
df2
和df_merge
(concat) - 利润
# initialize
df1 = pd.DataFrame(data={'A': [1, 2, 3], 'B': ["abc", "abc", "cde"], 'C': [0, 1, 0]})
df2 = pd.DataFrame(data={'A': [1, 2], 'B': ["abc", "abc"], 'C': [5, 5]})
# duplicate and drop
df2_dupli = df2.copy()
df2_dupli = df2_dupli.drop(columns=['C'])
# inner merge
df_merge = pd.merge(df1, df2_dupli, how='inner', left_on=['A','B'], right_on = ['A','B'])
# combine
df_out = pd.concat([df_merge, df2])
>>> df1
A B C
0 1 abc 0
1 2 abc 1
2 3 cde 0
>>> df2
A B C
0 1 abc 5
1 2 abc 5
>>> df_out
A B C
0 1 abc 0
1 2 abc 1
0 1 abc 5
1 2 abc 5
df_out
现在包含 df2
中的所有行,以及 df1
中指定列中与 df2
.
您可以设置索引,使其与您要匹配的数据对齐:
df1.set_index(['C','L','O','D','LN'], inplace=True)
df2.set_index(['C','L','O','D','LN'], inplace=True)
然后你可以将两个 dfs 合并成一个包含所有记录的 df
df_concat = pd.concat([df1, df2], axis=0)
剩下的就是找到存在于两个数据帧中的索引,并将其用于连接的 df:
i2keep = set(df1.index.tolist()) and set(df2.index.tolist())
df_concat.loc[i2keep,:].reset_index()
产量
C L O D LN M x y z w
0 FR 312 73 4/9/2021 1 W 1 0 0 0
1 FR 312 73 4/9/2021 1 W 0 1 0 0
2 FR 312 73 4/9/2021 1 W 0 0 1 0
3 FR 312 73 4/9/2021 1 L 1 0 0 1