📅  最后修改于: 2023-12-03 15:18:15.645000             🧑  作者: Mango
Pandas是Python的一个流行数据分析库,提供了强大的数据结构和数据操作功能。其中resample
函数可以按照不同的时间间隔重新采样数据,但如果你需要按照某个列值进行数据分层,该如何操作呢?
下面我们就来介绍如何利用Pandas按列值进行数据分层的重新采样。
我们首先创建一个示例数据集,其中包含时间、城市和销售额三个字段:
import pandas as pd
import numpy as np
date_rng = pd.date_range(start='1/1/2020', end='1/10/2020', freq='H')
data = pd.DataFrame(date_rng, columns=['date'])
data['city'] = np.random.choice(['New York', 'London', 'Paris'], len(date_rng))
data['sales'] = np.random.randint(1, 100, size=(len(date_rng)))
print(data.head())
输出结果如下:
date city sales
0 2020-01-01 00:00:00 New York 17
1 2020-01-01 01:00:00 Paris 20
2 2020-01-01 02:00:00 Paris 91
3 2020-01-01 03:00:00 Paris 95
4 2020-01-01 04:00:00 London 77
可以看出,数据集共计有240个时间点,3个不同的城市和3个不同的销售额。
现在我们将数据按每个城市的每个销售额进行分层,统计每个时间点的总销售额。代码如下:
df = data.set_index('date').groupby(['city', 'sales']).resample('D').sum().unstack([1,2]).fillna(0)
print(df.head())
输出结果如下:
sales \
1 2 3 4 5
city
2020-01-01 London 0.0 282.0 0.0 0.0 0.0
New York 135.0 0.0 0.0 0.0 0.0
Paris 0.0 1415.5714 307.0 0.0 0.0
2020-01-02 London 121.0 0.0 0.0 0.0 0.0
New York 237.0 0.0 0.0 0.0 0.0
... \
6 7 8 9 10 ...
city ...
2020-01-01 London 0.0 0.0 0.0 0.0 0.0 ...
New York 0.0 0.0 0.0 0.0 0.0 ...
Paris 0.0 0.0 0.0 0.0 0.0 ...
2020-01-02 London 0.0 0.0 0.0 0.0 0.0 ...
New York 0.0 0.0 0.0 0.0 0.0 ...
sales
92 93 95 96 98
city
2020-01-01 London 0.0 0.0 0.0 0.0 0.0
New York 0.0 0.0 17.0 0.0 0.0
Paris 534.0 238.0 333.0 198.0 105.0
2020-01-02 London 0.0 0.0 0.0 0.0 0.0
New York 2101.0 1023224.0 1192588.0 1082232.0 149313.0
[5 rows x 246 columns]
可以看出,现在数据按照每个城市的每个销售额分层。我们利用set_index
函数将date
字段设为索引,然后使用groupby
函数将数据按照city
和sales
两个字段进行分组。接着利用resample
函数将数据重新采样为每日数据,并对每个分层的数据进行求和操作。最后利用unstack
函数将结果展开为多级列索引格式,方便读取和处理。
利用Pandas的set_index
、groupby
、resample
和unstack
函数,我们可以轻松地按照某个列值进行数据分层的重新采样,实现更加细粒度的数据分析和处理。