【问题标题】:Combining multiple Pandas data frames based on specific column根据特定列组合多个 Pandas 数据框
【发布时间】:2018-10-27 14:08:05
【问题描述】:

假设我有多个 Pandas 数据框,每个数据框都有多个行和列,其中第一个包含某物的 ID。我想做的很简单,我使用合并、连接、连接等失败了...如果 df1 和 df2 的第一列相同,则将第 2 列附加到 df2 到 df1 的末尾,否则跳过它.

例如:

dat1={'A':['1', '2', '3'],'B':['4', '7', '11'],
  'C':['5', '8', '12'],'D':['6', '9', '13']}
df1 = pd.DataFrame.from_dict(dat1, orient='index')
dat2={'A':['1', '2', '3'],'B':['4', '7', '11'],
  'C':['5', '8', '12'],'D':['6', '9', '13']}
df2 = pd.DataFrame.from_dict(dat2, orient='index')

在这种情况下,由于两者的第一列都包含 A、B、C 和 D,那么合并后的数据框将有 4 行共 6 列。

df_merged
   0  1   2  3  4   5
A  1  2   3  1  2   3
B  4  7  11  4  7  11
C  5  8  12  5  8  12
D  6  9  13  6  9  13

如果第二个数据框中的 B 不是 E,那么我根本不会合并它们。

【问题讨论】:

  • 想要的输出?
  • 我在问题中写的df_merged

标签: python pandas dataframe merge


【解决方案1】:

使用 pd.concat,当将多个 DataFrame 粘合在一起,然后将它们连接到您想要的轴上时,来自 pandas Doc

>>> frames = [df1, df2]

>>> pd.concat(frames, axis=1)
   0  1   2  0  1   2
A  1  2   3  1  2   3
B  4  7  11  4  7  11
C  5  8  12  5  8  12
D  6  9  13  6  9  13

【讨论】:

  • 谢谢,但这不是我真正想要的。如果在列表中插入具有不同行索引的第三个数据框,它会引入 NaN。当且仅当第一列匹配时,才应连接第三个数据框。
  • @sensitive_scientist,它会在那里,但如果它与 df1 或 df2 类似,那么它会起作用,请在您要添加的示例中添加另一列..
【解决方案2】:

使用合并

pd.merge(df1,df2,left_index=True,right_index=True)

    0_x 1_x 2_x 0_y 1_y 2_y
A   1   2   3   1   2   3
B   4   7   11  4   7   11
C   5   8   12  5   8   12
D   6   9   13  6   9   13


def myFunc(df1,df2):
    if len(np.intersect1d(df1.index.values, df2.index.values)) == len(df1.index.values) & len(np.intersect1d(df1.index.values, df2.index.values)) == len(df2.index.values):
        df = pd.merge(df1,df2,left_index=True,right_index=True)
        return df
    else:
        pass

【讨论】:

  • 谢谢,但是如果我遇到具有不同行索引(A、B、C 和 D)的数据框,那么它将采用交叉点。我需要它来跳过那个数据框。
  • @sensitive_scientist 那么为什么不写一个条件呢?如果索引相同,则合并否则通过
猜你喜欢
  • 2016-10-08
  • 2018-11-24
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
相关资源
最近更新 更多