Python 3.x 合并数据帧以使用最新时间戳更新单元格
我有一个数据集存储在一个数据帧中,我需要从RESTAPI定期更新该数据帧,但问题是我只想更新特定的单元格,其中时间戳在我从RESTAPI提取时更为近期 为了说明这一点,我使用了以下数据帧:Python 3.x 合并数据帧以使用最新时间戳更新单元格,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,我有一个数据集存储在一个数据帧中,我需要从RESTAPI定期更新该数据帧,但问题是我只想更新特定的单元格,其中时间戳在我从RESTAPI提取时更为近期 为了说明这一点,我使用了以下数据帧: df1 = pd.DataFrame({'item': ['apple', 'orange', 'bananna'], 'A': ['2021-03-01', np.nan, '2021-08-01'], 'B': ['2021-03-01',
df1 = pd.DataFrame({'item': ['apple', 'orange', 'bananna'],
'A': ['2021-03-01', np.nan, '2021-08-01'],
'B': ['2021-03-01', '2020-03-16', '2021-07-15'],
'C': [np.nan, np.nan, np.nan]})
df1
item A B C
---------------------------------------
0 apple 2021-03-01 2021-03-01 NaN
1 orange NaN 2020-03-16 NaN
2 bananna 2021-08-01 2021-07-15 NaN
然后我从API中提取一个更新列表,如下所示:
df2 = pd.DataFrame({'item': ['apple', 'orange', 'bananna', 'watermelon'],
'A': ['2021-03-09', '2021-03-09', np.nan, '2021-03-09'],
'B': [np.nan, np.nan, np.nan, '2021-03-09'],
'C': ['2021-03-09', '2021-03-09', np.nan, '2021-03-09']})
df2
item A B C
-----------------------------------------------
0 apple 2021-03-09 NaN 2021-03-09
1 orange 2021-03-09 NaN 2021-03-09
2 bananna NaN NaN NaN
3 watermelon 2021-03-09 2021-03-09 2021-03-09
如何合并它们,使A、B和C下的每个单元格保留最新的时间戳,以获得如下结果
item A B C
-----------------------------------------------
0 apple 2021-03-09 2021-03-01 2021-03-09
1 orange 2021-03-09 2020-03-16 2021-03-09
2 bananna 2021-08-01 2021-07-15 NaN
3 watermelon 2021-03-09 2021-03-09 2021-03-09
通常,如果我只有1列时间戳,我会执行以下操作:
tmpDF1 = df1[["item", 'A']]
tmpDF2 = df2[["item", 'A']]
tmpDF1 = tmpDF1.append(tmpDF2, sort=False, ignore_index=True)
tmpDF1 = tmpDF1.sort_values(by='A', ascending=False, ignore_index=True)
tmpDF1 = tmpDF1.drop_duplicates(subset=['item'],keep='first')
因此,对于1timtestamp列,我只需使用keep first追加、排序、删除重复,我就可以了。然而,对于多个时间戳字段,我不知道如何更新每个单元格
这是可能的,还是我需要将所有这些数据子集到3个不同的数据帧中,附加、排序和删除重复数据,然后将它们重新组合到1个数据帧中?或者有更简单的方法吗?试试
concat
然后groupby().max()
:
输出
item A B C
0 apple 2021-03-09 2021-03-01 2021-03-09
1 orange 2021-03-09 2020-03-16 2021-03-09
2 bananna 2021-08-01 2021-07-15 NaT
3 watermelon 2021-03-09 2021-03-09 2021-03-09
第一个
A,B,C
列需要转换为datetime
,否则它会抛出错误,不是吗?@ashkanghFirst
不关心数据类型,所以不。对不起,我的例子不好。实际数据是一个日期时间值。这只是一个快速而肮脏的DF示例,用来说明我试图做什么。@user3246693没关系。正如我所说,代码应该适用于任何类型的数据。你只需要确保你的数据类型在df2
和df1
之间是一致的。谢谢你,我现在唯一的问题是我不明白为什么会这样?我想,第一个抓取了第一行最新的时间戳(或者最大的值是它的NoteDateTime)。既然解决方案中没有排序,那么如何确定每个列的最新时间戳呢?
item A B C
0 apple 2021-03-09 2021-03-01 2021-03-09
1 orange 2021-03-09 2020-03-16 2021-03-09
2 bananna 2021-08-01 2021-07-15 NaT
3 watermelon 2021-03-09 2021-03-09 2021-03-09