合并两个共享相同列值的数据框

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_duplidf1 上使用内部合并 可能删除Nan 行,不确定是否需要此步骤 结合 df2df_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 

【讨论】:

以上是关于合并两个共享相同列值的数据框的主要内容,如果未能解决你的问题,请参考以下文章

合并两个具有聚合列值的数据框作为结果

根据 Pandas 中的公共列值合并两个数据框

合并具有多索引和列值的数据框

如何计算与 R 中相同列值关联的两个行值的差异?

根据列值(字符串,子字符串)比较两个数据框并更新另一个列值

合并时间序列数据,以便将列值拟合到字典中