繁体   English   中英

Pandas 删除重复项并用重复项的 nanmean 替换该值

[英]Pandas drop duplicates and replace the value by the nanmean of the duplicates

我有一个通过附加 4 个数据帧创建的 dataframe(索引 = 日期)。 因此,我的索引中有重复项,通常在同一天有 3 个 NaN 和 1 个值。 我的目标是将这个 dataframe 上采样到每日频率( df = df.resample('1D) ),但在此之前我必须删除重复项。

我想删除时间重复,但根据 2 个条件:

  • 同一天,如果我们至少有 1 个值,计算这些值的 nanmean 并删除 rest。
  • 同一天,如果我们只有 NaN,则在我们保留的行中放置一个 NaN。

我猜想使用 np.nanmean() 将涵盖这两个条件(当没有值时返回 NaN,否则返回值的平均值)。

例如:

df = 
                                Pt0
1984-06-10 00:00:00.096000064   NaN
1984-06-10 00:00:00.096000064 -42.0
1984-07-20 00:00:00.176000000   NaN
1984-07-20 00:00:00.176000000   NaN
1984-07-28 00:00:00.192000000 -26.0
1984-07-28 00:00:00.192000000   NaN
1984-09-06 00:00:00.080000000   NaN
1984-09-06 00:00:00.080000000   NaN
1984-09-06 00:00:00.271999936   0
1984-09-06 00:00:00.271999936   -10

df_dropped = 
                               Pt0
1984-06-10 00:00:00.096000064 -42.0
1984-07-20 00:00:00.176000000   NaN
1984-07-28 00:00:00.192000000 -26.0
1984-09-06 00:00:00.080000000 -5.0

我尝试使用df = df.groupby('Pt0').mean().reset_index()但它最终跳过了 NaN,我想如果df.groupby()有一个nanmean() function 它会起作用。

我怎么能那样做?

首先,将索引转换为日期时间对象。 然后你可以按索引np.nanmean groupby 然后drop_duplicates

df.index = pd.to_datetime(df.index)
out = df.groupby(level=0)['Pt0'].transform(np.nanmean).drop_duplicates().to_frame()

Output:

                                  Pt0
0 1984-06-10 00:00:00.096000064 -42.0
1 1984-07-20 00:00:00.176000000   NaN
2 1984-07-28 00:00:00.192000000 -26.0
3 1984-09-06 00:00:00.271999936  -5.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM