Pandas groupby 有条件地找到 timedelta 列的平均值

超自然主义者

我在获取 timedelta 列的平均值时遇到问题。

我的数据如下所示:

user          date           Flag    Value        
0    ron  12/23/2016        'flag'    0 days 10:08:00     
1    ron  12/21/2016        'n/a'     0 days 08:00:00      
2    ron   12/23/2016       'flag'    0 days 10:08:00     
3    ron  12/21/2016        'n/a'     0 days 02:00:00      
4   andy   12/22/2016       'flag'    0 days 10:00:00     
5   andy   12/22/2016       'flag'    0 days 10:00:00     

我想通过基于 Flag==flag 取每个用户的值的平均值来生成一个 Avg 列。所以数据是这样的:

user          date           Flag    Value                   Avg
0    ron  12/23/2016        'flag'    0 days 10:08:00     0 days 10:08:00
1    ron  12/21/2016        'n/a'     0 days 08:00:00     0 days 10:08:00
2    ron   12/23/2016       'flag'    0 days 10:08:00     0 days 10:08:00
3    ron  12/21/2016        'n/a'     0 days 02:00:00     0 days 10:08:00
4   andy   12/22/2016       'flag'    0 days 10:00:00     0 days 10:00:00
5   andy   12/22/2016       'flag'    0 days 10:00:00     0 days 10:00:00

我有这个产生数据错误的代码:

sample.loc[:,'Value'] = pd.to_timedelta(sample['Value'])
sample.loc[:,'Avg'] = sample['user'].map(sample[sample['Flag']=='flag'].groupby('user')['Value'].mean())

但这是我得到的错误:

DataError: No numeric types to aggregate

当我将 Value 转换为 timedelta 时,我不确定为什么会这样说。指导表示赞赏。

塞尔吉·巴列斯塔

这里有不同的问题。

  1. 您想从子集中计算每个用户的平均值。好的:过滤相关行,使用 groupby 和 mean
  2. 您希望将该值应用于用户的所有值。正常的方法是在 groupby 之前用原始索引重新索引,并在 groupby 之后使用变换
  3. 您正在处理 Timedelta 列。您必须将其转换为数字列。这里的技巧是你应该使用整数类型但希望能够使用 NaN 值,所以我们必须转换两次,第一次转换为 int64,然后转换为 float64

它最终给出:

df['mean'] = pd.to_timedelta(df.loc[df['Flag'] == "'flag'", 'Value']
                             .astype('int64').astype('float64')
                             .reindex(df.index).groupby(df['user'])
                             .transform('mean'))

它给:

   user       date    Flag    Value     mean
0   ron 2016-12-23  'flag' 10:08:00 10:08:00
1   ron 2016-12-21   'n/a' 08:00:00 10:08:00
2   ron 2016-12-23  'flag' 10:08:00 10:08:00
3   ron 2016-12-21   'n/a' 02:00:00 10:08:00
4  andy 2016-12-22  'flag' 10:00:00 10:00:00
5  andy 2016-12-22  'flag' 10:00:00 10:00:00

注意:以上假设 Value 的数据类型是timedelta64[ns]( pd.Timedelta)。如果没有,您必须首先使用以下命令将其转换为 Timedelta:

df['Value'] = pd.to_timedelta(df['Value'])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Pandas GroupBy的平均值

从pandas groupby 在每个组中执行操作(滚动平均值/添加新列)的有效方法

Pandas groupby 具有不同窗口大小的滚动平均值 - 不同周期的移动平均值

如何根据pandas中的组找到列的平均值

根据条件pandas计算列平均值

Pandas Groupby有条件聚合

在B列中找到这些值的平均值,这些值位于A列中K个最大元素之一的行中:Pandas Dataframe GroupBy对象

python,pandas,使用groupby计算具有多索引的df中的平均值

Python pandas groupby 聚合一列,同时获得其余列的平均值

有条件地生成新列-Pandas

Pandas DataFrame:有条件地更新两列

pandas:有条件地返回列的值

Pandas - 有条件地连接两列

Python Pandas Groupby添加列分隔以获取平均值

pandas groupby将两列之间的差求和,并获得每组的平均值

Pandas/Python groupby 然后计算每组中另一列的平均值

Pandas Groupby平均值和多个列的第一个

Groupby 多列计算大小并计算 Pandas 中另一列的平均值

具有重复索引的数据帧上的groupby平均值或groupby平均值

Groupby Pandas 数据框并根据排名有条件地删除值

Pandas 遍历行或 groupby 并有条件地求和

有条件的平均值

Pandas groupby 计算每第 n 行的平均值

计算pandas中的groupby(几列)平均值

尊重时间的pandas.groupby对象的移动平均值

Python Pandas计算groupby平均值的Z得分

使用pandas groupby获取numpy数组的平均值

有条件地将列添加到 dplyr R 中的 groupby

Pandas:有条件的 groupby 和 max