【问题标题】:Resample pandas dataframe by both name and origin按名称和来源重新采样 pandas 数据帧
【发布时间】:2015-12-21 23:15:59
【问题描述】:

我有以下 Pandas DataFrame 对象df。它是列有出发日期、预定出发时间和列车公司的列车时刻表。

import pandas as pd
df = 

            Year  Month DayofMonth  DayOfWeek  DepartureTime Train    Origin
Datetime
1988-01-01  1988    1     1         5        1457      BritishRail   Leeds
1988-01-02  1988    1     2         6        1458      DeutscheBahn  Berlin
1988-01-03  1988    1     3         7        1459      SNCF           Lyons
1988-01-02  1988    1     2         6        1501      BritishRail   Ipswich

现在,我想通过列出某个铁路公司每周从该站出发的次数(按始发地)来重新采样这个时间序列。

例如,每周有多少辆英国铁路列车离开这个车站?每周有多少班从利兹出发的英国铁路列车离开这个车站?

我怀疑结果是熊猫系列对象。

我尝试了每周的 British Rails 总数

BR_weekly = df[df['Train']=='BritishRail'].resample("W", how='sum')

但这并没有给我表格的时间序列

Datetime   Number of trains
i.e.
Datetime
1988-01-03     434
1988-01-10     982
1988-01-17     989
Freq: W-SUN, dtype: int64

我该如何解决这个问题?

【问题讨论】:

    标签: python pandas time-series


    【解决方案1】:

    我的输入数据(添加和更改某些日期):

    print df
                Year  Month  DayofMonth  DayOfWeek  DepartureTime         Train  \
    Datetime                                                                      
    1988-01-01  1988      1           1          5           1457   BritishRail   
    1988-01-01  1988      1           1          5           1457   BritishRail   
    1988-01-10  1988      1           2          6           1458  DeutscheBahn   
    1988-01-12  1988      1           3          7           1459          SNCF   
    1988-01-20  1988      1           2          6           1501   BritishRail   
    
                 Origin  
    Datetime             
    1988-01-01    Leeds  
    1988-01-01    Leeds  
    1988-01-10   Berlin  
    1988-01-12    Lyons  
    1988-01-20  Ipswich   
    

    您可以使用groupby by Grouper 并计算列Train 的值。

    print df.groupby(pd.Grouper(freq='W'))['Train'].count()
    1988-01-03    2
    1988-01-10    1
    1988-01-17    1
    1988-01-24    1
    Freq: W-SUN, Name: Train, dtype: int64
    

    或者您可以通过count选择列Trainresample

    print df['Train'].resample('W', how='count')
    Datetime
    1988-01-03    2
    1988-01-10    1
    1988-01-17    1
    1988-01-24    1
    Freq: W-SUN, Name: Train, dtype: int64
    

    编辑:

    我认为你不能使用sum,因为它连接Train列中的字符串:

    print df.Train[df['Train'].isin(['BritishRail'])].resample("W", how='sum')
    Datetime
    1988-01-03    BritishRailBritishRail
    1988-01-10                         0
    1988-01-17                         0
    1988-01-24               BritishRail
    Freq: W-SUN, Name: Train, dtype: object
    

    使用isin 选择一列Train,其中BritishRail 并使用count 而不是sum 对其重新采样:

    print df.Train[df['Train'].isin(['BritishRail'])].resample("W", how='count')
    Datetime
    1988-01-03    2
    1988-01-10    0
    1988-01-17    0
    1988-01-24    1
    Freq: W-SUN, Name: Train, dtype: int64
    

    【讨论】:

    猜你喜欢
    • 2017-09-19
    • 2016-12-23
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 2018-02-01
    • 2020-11-29
    相关资源
    最近更新 更多