我想将数据帧减少到更多摘要数据。我有以下数据框:
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
系列告诉我ser_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
我想使用匹配来将我的数据框汇总为
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
因此,我得到ser_no
在特定国家/地区的范围以及在该时间范围内记录了多少日期的日期。
我不确定如何在Python中进行此摘要。
答案 0 :(得分:2)
您可以使用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