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

问题描述 投票:0回答:1

我在获取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取每个用户的Value平均值来生成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时为什么要这样说。指导表示赞赏。

python pandas group-by transform timedelta
1个回答
0
投票

这里有不同的问题。

  1. 您想从一个子集中计算每个用户的平均值。确定:过滤相关行,使用groupby和均值
  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

[Nota:以上假设Value的数据类型为timedelta64[ns]pd.Timedelta)。如果没有,则必须先使用以下方法将其转换为Timedelta:

df['Value'] = pd.to_timedelta(df['Value'])
© www.soinside.com 2019 - 2024. All rights reserved.