【问题标题】:Updating Pandas dataframe with "new information" when it includes NaNs当包含 NaN 时,使用“新信息”更新 Pandas 数据框
【发布时间】:2016-03-23 18:57:34
【问题描述】:

使用“新信息”更新 Pandas 数据框

我想做的是构建一个执行以下操作的函数(伪代码):

def update(original_information, new_information):
    ... stuff ...
    return updated_information

上面的输入和输出都是 Pandas 数据帧,它们都可以包含许多 NaN。

original_information的示例:

import pandas as pd
columns = ['edgar', 'morningstar', 'yahoo']
companies = [{'edgar': '0000320193', 'yahoo': 'AAPL'}, {'morningstar': 'XYZ', 'yahoo': 'SGO.PA'}]
original_information = pd.DataFrame(companies, columns=columns).sort_values('yahoo').reset_index(drop=True)

   edgar        morningstar  yahoo
0  00000320193  NaN          AAPL
1  NaN          XYZ          SGO.PA

新信息示例:

import pandas as pd
columns = ['edgar', 'morningstar', 'yahoo']
companies = [{'morningstar': 'AAPL', 'yahoo': 'AAPL'}, {'morningstar': 'XPAR:SGO', 'yahoo': 'SGO.PA'}]
new_information = pd.DataFrame(companies, columns=columns).sort_values('yahoo').reset_index(drop=True)

   edgar  morningstar  yahoo
0  NaN    AAPL         AAPL
1  NaN    XPAR:SGO     SGO.PA

理想情况下,我的 update 函数会完成三件事:

  1. 在单元格 (1, Morningstar) 中,将“XYZ”更新为“XPAR:SGO”,因为“XPAR:SGO”是较新的信息
  2. 在单元格 (0, Morningstar) 中,显示“AAPL”,因为原始信息是“NaN”
  3. 在单元格 (0, edgar) 中,保留“000320192”,因为该单元格没有新信息

换句话说,我希望 updated_information 如下所示:

   edgar        morningstar  yahoo
0  00000320193  AAPL         AAPL
1  NaN          XPAR:SGO     SGO.PA

但是,我还没有弄清楚如何做到这一点

我有以下内容:

def update(original_information, new_information):
    result = pd.concat([original_information, new_information], ignore_index=True)
    result = result.drop_duplicates(subset='yahoo', keep='last').sort_values('yahoo').reset_index(drop=True)
    return result

返回:

   edgar  morningstar  yahoo
0  NaN    AAPL         AAPL
1  NaN    XPAR:SGO     SGO.PA

哪个...

  1. 成功地将单元格(1,晨星)中的“XYZ”替换为“XPAR:SGO”

  2. 使用“AAPL”成功更新单元格(0,晨星)

  3. 但不幸的是删除单元格 (0, edgar) 中的 '000320192' 而不是保留它

有什么建议吗?

【问题讨论】:

  • 明确的问题。

标签: python pandas merge dataframe


【解决方案1】:

我认为您可以只使用.update,因为它在进行更新时只使用来自新数据的非 NA 值。

original_information.update(new_information)

【讨论】:

  • 这么简单的答案!它似乎有效。我现在确实感到很愚蠢,但感谢您的帮助!
  • 好的。当我开始想出其他例子时,这对我来说并不适用。我有一个新问题,如果我能找到答案,就能解决我所有的问题。
  • 在这里(如果我能在评论中正确地写出来的话):
  • 没关系。想我刚刚解决了它。无论如何,谢谢!
  • 当我弄清楚所有问题后,我会发布一个更一般的答案。
猜你喜欢
  • 1970-01-01
  • 2018-09-18
  • 2012-11-16
  • 1970-01-01
  • 2018-11-02
  • 2021-07-14
  • 2021-08-26
  • 1970-01-01
  • 2014-06-27
相关资源
最近更新 更多