Pandas groupby 条件查找 timedelta 列的平均值
Pandas groupby conditional to find mean of timedelta column
我在获取 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 时会这样说。指导表示赞赏。
这里有不同的问题。
- 您想从一个子集中计算每个用户的平均值。好的:过滤相关行,使用 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
注意:以上假设 Value 的数据类型是 timedelta64[ns]
(pd.Timedelta
)。如果不是,您必须首先将其转换为 Timedelta:
df['Value'] = pd.to_timedelta(df['Value'])
我在获取 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 时会这样说。指导表示赞赏。
这里有不同的问题。
- 您想从一个子集中计算每个用户的平均值。好的:过滤相关行,使用 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
注意:以上假设 Value 的数据类型是 timedelta64[ns]
(pd.Timedelta
)。如果不是,您必须首先将其转换为 Timedelta:
df['Value'] = pd.to_timedelta(df['Value'])