【发布时间】: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, Morningstar) 中,将“XYZ”更新为“XPAR:SGO”,因为“XPAR:SGO”是较新的信息
- 在单元格 (0, Morningstar) 中,显示“AAPL”,因为原始信息是“NaN”
- 在单元格 (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,晨星)中的“XYZ”替换为“XPAR:SGO”
使用“AAPL”成功更新单元格(0,晨星)
但不幸的是删除单元格 (0, edgar) 中的 '000320192' 而不是保留它
有什么建议吗?
【问题讨论】:
-
明确的问题。
标签: python pandas merge dataframe