【问题标题】:Replace data from one pandas dataframe to another将数据从一个 pandas 数据帧替换为另一个
【发布时间】:2015-08-05 19:05:12
【问题描述】:

我有两个数据框 df1 和 df2 。它们都包含时间序列数据,因此 df1 和 df2 中的某些日期可能彼此相交,而其余日期则不相交。我的要求是对两个数据帧进行操作,将 df1 中的值替换为 df2 中相同日期的值,只保留 df1 中不存在于 df2 中的索引值,并添加 df2 中存在的索引值而不是 df1 中的值。考虑以下示例:

df1:
    A   B   C   D
0   A0  BO  C0  D0
1   A1  B1  C1  D1
2   A2  B2  C2  D2
3   A3  B3  C3  D3

df2:
    A   B   C   E
1   A4  B4  C4  E4
2   A5  B5  C5  E5
3   A6  B6  C6  E6
4   A7  B7  C7  E7

result df:
    A   B   C   D   E
0   A0  BO  C0  D0  Nan
1   A4  B4  C4  D4  E4
2   A5  B5  C5  D5  E5
3   A6  B6  C6  D6  E6
4   A7  B7  C7  D7  E7

我尝试通过连接两个 dfs 的第一步来开发逻辑,但这会导致行具有重复的索引,并且不知道如何处理。 如何做到这一点?任何建议都会有所帮助

编辑:更简单的情况是两个数据框中的列名相同。因此,请考虑 df2 具有 D 列而不是 E 列,其值为 D4、D5、D6、D7。

串联产生以下结果:

concat(df1,df2,axis=1)
    A    B    C    D    A    B    C    D
0   A0   B0   C0   D0  NaN  NaN  NaN  NaN  
1   A1   B1   C1   D1   A4   B4   C4   D4
2   A2   B2   C2   D2   A5   B5   C5   D5
3   A3   B3   C3   D3   A6   B6   C6   D6
4  NaN  NaN  NaN  NaN   A7   B7   C7   D7

现在这引入了重复的列。传统的解决方案是遍历每一列,但我正在寻找更优雅的解决方案。任何想法将不胜感激。

【问题讨论】:

  • 这个设置的问题是 DataFrames 不会在 D & E 列上对齐。
  • 为简单起见,我们可以忽略列 E 并假设它们具有相同的列,如果 df2 的列是 D 而不是 E 的值为 D4-D7,那么如何实现此操作

标签: python pandas


【解决方案1】:

update 将在两个 DataFrame 的索引上对齐:

df1.update(df2)

df1:
    A   B   C   D
0   A0  BO  C0  D0
1   A1  B1  C1  D1
2   A2  B2  C2  D2
3   A3  B3  C3  D3

df2:
    A   B   C   D
1   A4  B4  C4  D4
2   A5  B5  C5  D5
3   A6  B6  C6  D6
4   A7  B7  C7  D7

>>> df1.update(df2)
    A   B   C   D
0  A0  BO  C0  D0
1  A4  B4  C4  D4
2  A5  B5  C5  D5
3  A6  B6  C6  D6

然后您需要添加 df2 中不存在于 df1 中的值:

>>> df1.append(df2.loc[[i for i in df2.index if i not in df1.index], :])
Out[46]: 
    A   B   C   D
0  A0  BO  C0  D0
1  A4  B4  C4  D4
2  A5  B5  C5  D5
3  A6  B6  C6  D6
4  A7  B7  C7  D7

【讨论】:

  • 绝对解决了 alexander 的一部分问题,即用 df2 中的值替换相同索引的 df1 中的值。但是,在上述情况下,我们没有跟踪 df2 中的索引—— df1 中不存在 4。最终结果也应该包含它
  • 修改后的回复也包括在内。
  • 是的,效果很好,谢谢。我想除了循环第二个数据帧来实现所需的输出之外别无他法。非常感谢您的帮助,谢谢!
  • 您可能没有注意到,但您现在有足够的声誉来支持响应 (-;
【解决方案2】:

我刚看到这个问题,发现它和我今天刚刚问的几乎一模一样,@Alexander(上面答案的发布者)回答得很好:

pd.concat([df1[~df1.index.isin(df2.index)], df2])

请参阅pandas DataFrame concat / update ("upsert")? 进行讨论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2015-09-08
    • 1970-01-01
    • 2023-03-25
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多