【问题标题】:Merging two dataframes based on groups pandas基于组 pandas 合并两个数据框
【发布时间】:2023-03-09 13:09:01
【问题描述】:

我想要两个合并这两个数据框:

df1
    a   b   c                              
4   0   1   3
5   0   1   3
6   0   1   3
2   1   2   2
3   1   2   2
15  2   1   3
12  2   1   3
13  2   1   3
15  3   1   4
14  3   1   4
8   3   1   4
9   3   1   4
df2

b  c  e
1  3  2
1  3  0
1  3  1

df1 应按 a 分组,如果它们在 a 的一组中相等,则应与 df2 合并。 合并/加入后应该是这样的:

    a   b   c   e                              
4   0   1   3   2
5   0   1   3   0
6   0   1   3   1
2   1   2   2   nan
3   1   2   2   nan
15  2   1   3   2
12  2   1   3   0
13  2   1   3   1
15  3   1   4   nan
14  3   1   4   nan
8   3   1   4   nan
9   3   1   4   nan

谁能帮帮我?

【问题讨论】:

  • df2 的组键是什么
  • 我编辑了这篇文章。如果 b 和 c 在两个 df 中相等,我总是想将 df2 放入 df1。
  • 在示例中,匹配组正好有 3 行。这总是有保证的吗?
  • 不,只有当 df1 在一组中有 3 行时,它才应该与 df2 合并。会有其他 df 就像 df2 一样应该合并 2 行、4 行等组。例如,可能会发生两个完全相同的 3 组,但它们在 a 上会有所不同。
  • 对不起。是的,在这种情况下,它正好是 3。

标签: python pandas


【解决方案1】:

您并不真正想要合并,因为您想要复制 3 行的值,而 2 列的值对于这 3 行是通用的。

我会使用一个专用函数来控制一个组确实包含与df2 一样多的行,并且值是否相同:

def tst(x):
    if len(x) != 3: return False
    x = x.reset_index()[['b', 'c']]
    return (x == df2[['b', 'c']]).all().all()

我们可以这样写:

new_col = df1.groupby('a').apply(lambda x: df2['e'] if tst(x) else pd.Series(
    pd.np.nan, index = x.index))

【讨论】:

    【解决方案2】:
    new_df = pd.merge(df1, df2,  how='left', left_on=['b','c'], right_on = ['b','c'])
    

    这应该适用于您的情况。 Doc link

    【讨论】:

    • 请在链接中包含上下文。
    • 这不正是我想要的。它应该只在同一组中合并。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2016-07-23
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 2019-05-01
    • 2015-10-17
    相关资源
    最近更新 更多