Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 合并数据帧以使用最新时间戳更新单元格_Python 3.x_Pandas_Dataframe - Fatal编程技术网

Python 3.x 合并数据帧以使用最新时间戳更新单元格

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',

我有一个数据集存储在一个数据帧中,我需要从RESTAPI定期更新该数据帧,但问题是我只想更新特定的单元格,其中时间戳在我从RESTAPI提取时更为近期

为了说明这一点,我使用了以下数据帧:

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
,否则它会抛出错误,不是吗?@ashkangh
First
不关心数据类型,所以不。对不起,我的例子不好。实际数据是一个日期时间值。这只是一个快速而肮脏的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