![](/img/trans.png)
[英]using resample to aggregate data with different rules for different columns in a pandas dataframe
[英]Resample a dataframe with different aggregate functions
我有一个如下所示的数据框,它有一个“统计”列,其中包含每个 1 秒时间戳的不同统计值(平均、计数、最小值、最大值)。
时间戳 | 地点 | 服务 | 状态码 | 统计数据 | 价值 |
---|---|---|---|---|---|
1656533176875 | 一个 | s1 | 200 | 数数 | 5000 |
1656533176875 | 一个 | s1 | 500 | 平均 | 3000 |
…… | …… | …… | …… | ... | ... |
1656533176878 | 乙 | s2 | 504 | 最大限度。 | 6000 |
现在,从这个数据框中,我必须对用户定义的时间间隔(比如 5 分钟的间隔)重新采样数据,然后聚合该间隔的值。 由于这些值代表不同的聚合,我需要为数据框的不同部分应用不同的聚合函数。 例如,如果我想对 5 分钟的数据重新采样,如果“统计”为“平均”,则需要应用平均值,如果“统计”为计数,则需要应用总和。 此外,分组必须按中心、服务和状态代码。 到目前为止,我已经编写了这段代码,但我无法得到想要的结果。
#sample dataframe
rng = pd.date_range('2022-06-01', periods=10, freq='T')
np.random.seed(10)
l = ['A', 'B', 'C', 'D']
k = ['avg', 'max', 'min', 'count', 'median', 'std']
m = ['s1', 's2', 's3']
j = [200, 400, 404, 500]
df = pd.DataFrame(
{'date_time': rng,
'location': random.choices(l, k=10),
'service': random.choices(m, k=10),
'status': random.choices(j, k=10),
'stat': random.choices(k, k=10),
'value': np.random.randint(100, 900, size=10)
}
)
df.sort_values(by=df.columns.to_list())
print(df)
interval =5
resampled_df = df.assign(
n_count=np.where(df['stat'] == 'count'),
n_median=np.where(df['stat'] == 'median'),
n_max=np.where(df['stat'] == 'max'),
n_min=np.where(df['stat'] == 'min'),
n_avg=np.where(df['stat'] == 'avg'),
n_std=np.where(df['stat'] == 'std'),
).groupby(['date_time', 'location', 'services', 'status_code', 'stat']) \
.resample('{}min'.format(interval), on='date_time') \
.value \
.agg({'n_count': sum, 'n_avg': np.mean, 'n_max': max, 'n_min': min, 'n_std': np.std,
'n_median': np.median})
print(resampled_df)
我收到错误 ValueError:值的长度 (1) 与索引的长度 (10) 不匹配。 预期结果是 5 分钟的重新采样数据,其汇总值取决于“统计”列。
我仍然不确定您的输出应该是什么样子,但这是一个尝试:
agg_dict = {'avg':'mean',
'count':'count',
'max':'max',
'median':'median',
'std':'std'}
interval = 2
df.pivot(['date_time', 'location', 'service', 'status'],
'stat',
'value')\
.reset_index(level=[1,2,3])\
.rename_axis('date_time')\
.groupby(['date_time', 'location', 'service', 'status']) \
.resample(f'{interval}T')\
.agg(agg_dict)\
.reset_index(level=0, drop=True)\
.stack()\
.reset_index()
输出:
location service status date_time stat 0
0 B s1 200 2022-06-01 00:00:00 count 0.0
1 B s1 200 2022-06-01 00:00:00 max 482.0
2 B s2 500 2022-06-01 00:00:00 avg 753.0
3 B s2 500 2022-06-01 00:00:00 count 0.0
4 A s2 200 2022-06-01 00:02:00 count 0.0
5 A s2 200 2022-06-01 00:02:00 median 442.0
6 D s3 200 2022-06-01 00:02:00 count 0.0
7 D s3 200 2022-06-01 00:02:00 max 898.0
8 A s1 500 2022-06-01 00:04:00 count 1.0
9 B s2 500 2022-06-01 00:04:00 count 0.0
10 D s1 404 2022-06-01 00:06:00 count 0.0
11 A s3 200 2022-06-01 00:06:00 count 0.0
12 B s1 500 2022-06-01 00:08:00 count 1.0
13 B s3 404 2022-06-01 00:08:00 count 0.0
14 B s3 404 2022-06-01 00:08:00 max 383.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.