合并两个共享相同列值的数据框
Posted
技术标签:
【中文标题】合并两个共享相同列值的数据框【英文标题】:merge two dataframe that share the same column value 【发布时间】:2021-12-17 19:16:02 【问题描述】:我有两个数据框 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 |
感谢您的帮助
【问题讨论】:
这能回答你的问题吗? how to merge two data frames based on particular column in pandas python? 并非如此。我在两个 df 上都有完全相同的列。输出应该是相同的列名 因为帖子的格式不正确,所以我要离开标题了。现在似乎您想根据第二个数据框过滤第一个数据框?看起来根本不像合并 这不是内部合并吗? df2 只是一行,但实际上它不止一个 我猜是的,试试:***.com/questions/41815079/… 【参考方案1】:正如我试图在 cmets 中指出的那样,一个可能的解决方案是:
复制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
具有相同值的行。
【讨论】:
【参考方案2】:您可以设置索引,使其与您要匹配的数据对齐:
df1.set_index(['C','L','O','D','LN'], inplace=True)
df2.set_index(['C','L','O','D','LN'], inplace=True)
然后您可以将两个 dfs 合并为一个包含所有记录的 dfs
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
【讨论】:
以上是关于合并两个共享相同列值的数据框的主要内容,如果未能解决你的问题,请参考以下文章