Python:使用一系列

Python:使用一系列,python,pandas,dataframe,Python,Pandas,Dataframe,我想将dataframe缩减为更多的摘要数据。我有以下数据帧: In [8]: df Out[8]: CTRY_NM ser_no date 0 a 1 2016-01-01 1 a 1 2016-01-02 2 b 1 2016-03-01 3 e 2 2016-01-01 4 e 2 2016-01-02 5 a 2 2016-0

我想将dataframe缩减为更多的摘要数据。我有以下数据帧:

In [8]: df
Out[8]: 
  CTRY_NM  ser_no       date
0       a       1 2016-01-01
1       a       1 2016-01-02
2       b       1 2016-03-01
3       e       2 2016-01-01
4       e       2 2016-01-02
5       a       2 2016-06-05
6       b       2 2016-07-01
7       b       3 2016-01-01
8       b       3 2016-01-02
9       d       3 2016-08-02
我用以下方法创建了此文件:

import pandas as pd
import numpy as np

df = pd.DataFrame({'ser_no': [1, 1, 1, 2, 2, 2, 2, 3, 3, 3],
    'CTRY_NM': ['a', 'a', 'b', 'e', 'e', 'a', 'b', 'b', 'b', 'd'],
    'day': ['01', '02', '01', '01', '02', '05', '01', '01', '02', '02'],
    'month': ['01', '01', '03', '01', '01', '06', '07', '01', '01', '08'],
    'year': ['2016','2016', '2016', '2016', '2016', '2016', '2016', '2016',\
    '2016', '2016']})
df['date'] = pd.to_datetime(df.day + df.month + df.year, format = "%d%m%Y")
df = df.drop(df.columns[[1,2,4]], axis = 1)

def check(data, key):
    mask = data[key].shift(1) == data[key]
    mask.iloc[0] = np.nan
    return mask

match = df.groupby(by = ['ser_no']).apply(lambda x: check(x, 'CTRY_NM'))
现在,
match
系列告诉我
seru no
何时在同一个国家/地区,何时不在序列号更改位置与
NaN
匹配。匹配返回:

In [9]: match
Out[9]: 
ser_no   
1       0    NaN
        1    1.0
        2    0.0
2       3    NaN
        4    1.0
        5    0.0
        6    0.0
3       7    NaN
        8    1.0
        9    0.0
Name: CTRY_NM, dtype: float64
我想使用match将我的数据帧总结为

ser_no  CTRY_NM  start_dt    end_dt      number_of_dt
1       a        2016-01-01  2016-01-02  2
1       b        2016-03-01  2016-03-01  1
2       e        2016-01-01  2016-01-02  2
2       a        2016-06-05  2016-06-05  1
2       b        2016-07-01  2016-07-01  1
3       b        2016-01-01  2016-01-02  2
3       d        2016-08-02  2016-08-02  1
所以我得到了一个日期,一个特定国家的
seru_no
范围,以及在这个时间范围内记录了多少个日期


我不知道如何在Python中进行此摘要。

您可以使用
agg
并为每个日期值指定一个操作:

>>> df.groupby(['ser_no', 'CTRY_NM']).date.agg(
        {'start_dt': min, 
         'end_dt': max, 
         'number_of_dt': 'count'})
                number_of_dt   start_dt     end_dt
ser_no CTRY_NM                                    
1      a                   2 2016-01-01 2016-01-02
       b                   1 2016-03-01 2016-03-01
2      a                   1 2016-06-05 2016-06-05
       b                   1 2016-07-01 2016-07-01
       e                   2 2016-01-01 2016-01-02
3      b                   2 2016-01-01 2016-01-02
       d                   1 2016-08-02 2016-08-02