微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对删除的重复行 Pandas DataFrame 的值求和

如何解决对删除的重复行 Pandas DataFrame 的值求和

对于时间序列分析,我必须删除发生在同一日期的实例。但是,保留一些“已删除”信息并将其添加到剩余的“重复”实例中。下面是我的数据集部分的简短示例。

z = pd.DataFrame({'lat':[49.125,49.125],'lon':[-114.125,-114.125 ],'time':[np.datetime64('2005-08-09'),np.datetime64('2005-08-09')],'duration':[3,6],'size':[4,10]})

    lat     lon         time        duration    size
0   49.125  -114.125    2005-08-09  3           4
1   49.125  -114.125    2005-08-09  6           10

我想删除具有最低“持续时间”值但同时对“大小”变量求和的(重复)实例。输出看起来像:

    lat     lon         time        duration    size
0   49.125  -114.125    2005-08-09  6           14

有谁知道我将如何解决这样的问题?此外,对于另一个变量,我想取这些值的平均值。但我确实认为这个过程类似于对值求和。

编辑:到目前为止,我知道如何获得最高的持续时间值以继续使用:

z.sort_values(by='duration',ascending=False).drop_duplicates(subset=['lat','lon','time'],keep='last')

解决方法

分组以获取总和并合并回 df 上的唯一值,没有重复项:

import pandas as pd
import numpy as np

z = pd.DataFrame({'lat':[49.125,49.125],'lon':[-114.125,-114.125 ],'time':[np.datetime64('2005-08-09'),np.datetime64('2005-08-09')],'duration':[3,6],'size':[4,10]}) # original data

gp = z.groupby(['lat','lon','time'],as_index=False)[['size']].sum() # getting the sum of 'size' for unique combination of lat,lon,time

df = z.sort_values(by='duration',ascending=True).drop_duplicates(subset=['lat',keep='last') # dropping duplicates

pd.merge(df[['lat','time','duration']],gp,on=['lat','time']) # adding the columns summed onto the df without duplicates

      lat      lon       time  duration  size
0  49.125 -114.125 2005-08-09         6    14

另一种基于 sophocles 答案的方法:

res = z.sort_values(by='duration',ascending=False).groupby(['time','lat','lon']).agg({
                                           'duration':'first',# same as 'max' since we've sorted the data by duration DESC
                                           'size':'sum'})

如果您有几列想要保留(您在 first 函数中有很多 agg),这个可能会变得不太可读

,

如果这些都是您的数据框中的所有列,您可以在时间列上使用 groupby 获得结果,并传入每列的聚合。

更具体地说,您可以通过保持 max() 持续时间删除具有最低“持续时间”的(重复)实例,同时将“大小”相加' 变量,在您的尺寸列上使用 sum()

res = z.groupby('time').agg({'lat':'first','lon':'first','duration':'max','size':'sum'}).  \
    reset_index()

res

        time     lat      lon  duration  size
0 2005-08-09  49.125 -114.125         6    14

唯一的区别是“时间”现在是您的第一列,您可以快速修复。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。