2016-03-29 40 views
2

Veri çerçevesini daha fazla özet verisine indirmek istiyorum. Python: veri çerçevesindeki verileri özetleyen bir

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 

Ben bu yaratılan: Aşağıdaki dataframe sahip bir ser_no aynı ülkede ve ne zaman

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')) 

Şimdi match serisi söylüyor o seri bir NaN ile değilken sayı değiştirme yeri. Maç döner: Ben

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 

Yani randevum ser_no belirli bir ülkede yapılmış ve kaç tarihleri ​​bu kaydedildi ettiğini aralığı olsun benim dataframe özetlemek maçı kullanmak istiyorum

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 

zaman aralığı.

Bu özetlemenin Python'da nasıl gerçekleştirileceğinden emin değilim.

cevap

2

Sen agg kullanabilir ve her tarih değeri için bir operasyon belirtebilirsiniz:

>>> 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 
+0

Öyleyse size maç 'series' gerek yoktu, teşekkürler – dustin

İlgili konular