对(删除的)重复行的值求和 Pandas DataFrame
Summing values of (dropped) duplicate rows Pandas DataFrame
对于时间序列分析,我必须删除同一日期发生的实例。但是,保留一些 'deleted' 信息并将其添加到剩余的 'duplicate' 实例中。下面是我的部分数据集的简短示例。
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
我想删除具有最低 'duration' 值但同时对 'size' 变量求和的(重复)实例。输出看起来像:
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')
Group by 获取总和并合并回 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', 'lon','time'], keep='last') # dropping duplicates
pd.merge(df[['lat', 'lon', 'time', 'duration']], gp, on=['lat', 'lon', '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
另一种基于索福克勒斯答案的方法:
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'})
如果您要保留多个列(agg
函数中会有很多 first
),那么该列的可读性可能会降低)
如果这些是数据框中的所有列,您可以在时间列上使用 groupby
并传入每列的聚合来获得结果。
更具体地说,您可以通过保持 max()
持续时间 删除具有最低 'duration' 的(重复)实例,并且 同时通过在尺寸列上使用 sum()
对 'size' 变量 求和。
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
唯一的区别是 'time' 现在是您的第一列,您可以快速修复它。
对于时间序列分析,我必须删除同一日期发生的实例。但是,保留一些 'deleted' 信息并将其添加到剩余的 'duplicate' 实例中。下面是我的部分数据集的简短示例。
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
我想删除具有最低 'duration' 值但同时对 'size' 变量求和的(重复)实例。输出看起来像:
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')
Group by 获取总和并合并回 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', 'lon','time'], keep='last') # dropping duplicates
pd.merge(df[['lat', 'lon', 'time', 'duration']], gp, on=['lat', 'lon', '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
另一种基于索福克勒斯答案的方法:
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'})
如果您要保留多个列(agg
函数中会有很多 first
),那么该列的可读性可能会降低)
如果这些是数据框中的所有列,您可以在时间列上使用 groupby
并传入每列的聚合来获得结果。
更具体地说,您可以通过保持 max()
持续时间 删除具有最低 'duration' 的(重复)实例,并且 同时通过在尺寸列上使用 sum()
对 'size' 变量 求和。
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
唯一的区别是 'time' 现在是您的第一列,您可以快速修复它。