在数据框熊猫中的列的子集中处理重复的行

时间:2018-11-06 15:03:31

标签: pandas dataframe duplicates data-manipulation

假设我有一个数据框,如下所示:

df = pd.DataFrame({"user":[11,11,11,21,21,21,21,21,32,32], 
               "event":[0,0,1,0,0,1,1,1,0,0], 
               "datetime":['05:29:54','05:32:04','05:32:08',
                           '15:35:26','15:36:07','15:36:16','15:36:50','15:36:54',
                           '09:29:12', '09:29:25'] })

enter image description here

我想处理第一列(用户)中的重复行以达到以下要求。

enter image description here

在这种情况下,我们将“事件”列替换为“用户”列中相关的最大值(例如,对于user = 11,事件的最大值为1)。第三列替换为日期时间的平均值。

P.S。已经讨论了删除重复行here的问题,但是,我不想盲目删除行。尤其是当我处理具有很多属性的数据框时。

2 个答案:

答案 0 :(得分:3)

您要groupbyaggregate

df.groupby('user').agg({'event': 'max', 
                        'datetime': lambda s: pd.to_timedelta(s).mean()})

如果需要,也可以先使用datetimetimedelta列更改为pd.to_timedelta,然后将mean放入agg

您可以使用str代表您的意图

df.groupby('user').agg({'event': 'max', 
                        'datetime': lambda s: str(pd.to_timedelta(s).mean().to_pytimedelta())})

答案 1 :(得分:1)

您可以将datetime转换为本地整数并聚合mean,最后转换回来,对于HH:MM:SS字符串,请使用strftime

df['datetime'] = pd.to_datetime(df['datetime']).astype(np.int64)

df1 = df.groupby('user', as_index=False).agg({'event':'max', 'datetime':'mean'})
df1['datetime'] = pd.to_datetime(df1['datetime']).dt.strftime('%H:%M:%S')
print (df1)
   user  event  datetime
0    11      1  05:31:22
1    21      1  15:36:18
2    32      0  09:29:18