Python 通过条件查找timedelta列的平均值

Python 通过条件查找timedelta列的平均值,python,pandas,group-by,transform,timedelta,Python,Pandas,Group By,Transform,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

我很难得到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     
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
我想通过基于Flag==Flag获取每个用户的平均值来生成一个Avg列。因此,数据如下所示:

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     
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

我不知道当我将值转换为timedelta时为什么会这样说。感谢您的指导

这里有不同的问题

  • 您希望从子集计算每个用户的平均值。确定:筛选相关行,使用groupby和mean
  • 您希望该值应用于用户的所有值。通常的方法是使用原始索引在groupby之前重新编制索引,并在groupby之后使用转换
  • 您正在处理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
    
    注:以上假设值的数据类型为
    timedelta64[ns]
    pd.Timedelta
    )。如果没有,则必须首先使用以下命令将其转换为Timedelta:

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

    这回答了你的问题吗?试试这个:如果在值列中存在NAT值,我怎么能考虑呢?不确定这是不是正确的评论方式,但是我发现如果我加上“DROPNA.”(Acthype)(“It64”),非常感谢你花时间。