📜  pandas 重新采样按列值分层 - Python (1)

📅  最后修改于: 2023-12-03 15:18:15.645000             🧑  作者: Mango

Pandas 重新采样按列值分层

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函数将数据按照citysales两个字段进行分组。接着利用resample函数将数据重新采样为每日数据,并对每个分层的数据进行求和操作。最后利用unstack函数将结果展开为多级列索引格式,方便读取和处理。

总结

利用Pandas的set_indexgroupbyresampleunstack函数,我们可以轻松地按照某个列值进行数据分层的重新采样,实现更加细粒度的数据分析和处理。