2016-03-29 14 views
0

Aşağıdaki örnekte Python 3.4 komut dosyası var. Bu yapar:Pandas groupby nesneleri ne zamandır hatırlanıyor?

  1. bir dataframe,
  2. datetime64 biçime tarih değişkeni dönüştürür,
  3. iki kategorik değişkenlere dayalı bir GroupBy nesnesi oluşturur
  4. sayımını içeren bir dataframe üretir oluşturur her bir gruptaki sayı öğeleri
  5. , veri grubunu orijinal veri çerçevesine geri vererek her gruptaki satır sayısını içeren bir sütun oluşturmak için toplar.
  6. , dak değerini içeren bir sütun oluşturur. sıralı satırlar arasındaki tesbiti.

    import numpy as np 
    import pandas as pd 
    
    # Create dataframe consisting of id, date and two categories (gender and age) 
    tempDF = pd.DataFrame({ 'id': [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20], 
             'date': ["02/04/2015 02:34","06/04/2015 12:34","09/04/2015 23:03","12/04/2015 01:00","15/04/2015 07:12","21/04/2015 12:59","29/04/2015 17:33","04/05/2015 10:44","06/05/2015 11:12","10/05/2015 08:52","12/05/2015 14:19","19/05/2015 19:22","27/05/2015 22:31","01/06/2015 11:09","04/06/2015 12:57","10/06/2015 04:00","15/06/2015 03:23","19/06/2015 05:37","23/06/2015 13:41","27/06/2015 15:43"], 
             'gender': ["male","female","female","male","male","female","female",np.nan,"male","male","female","male","female","female","male","female","male","female",np.nan,"male"], 
             'age': ["young","old","old","old","old","old",np.nan,"old","old","young","young","old","young","young","old",np.nan,"old","young",np.nan,np.nan]}) 
    
    # Convert date to datetime 
    tempDF['date'] = pd.to_datetime(tempDF['date']) 
    
    # Create groupby object based on two categorical variables 
    tempGroupby = tempDF.sort_values(['gender','age','id']).groupby(['gender','age']) 
    
    # Count number in each group and merge with original dataframe to create 'count' column 
    tempCountsDF = tempGroupby['id'].count().reset_index(drop=False) 
    tempCountsDF = tempCountsDF.rename(columns={'id': 'count'}) 
    tempDF = tempDF.merge(tempCountsDF, on=['gender','age']) 
    
    # Calculate difference between consecutive rows in each group. (First row in each 
    # group should have date difference = NaT) 
    tempGroupby = tempDF.sort_values(['gender','age','id']).groupby(['gender','age']) 
    tempDF['diff'] = tempGroupby['date'].diff() 
    print(tempDF) 
    

    Bu komut aşağıdaki çıktıyı üretir: Burada

script

 age    date gender id count    diff 
0 young 2015-02-04 02:34:00 male 1  2     NaT 
1 young 2015-10-05 08:52:00 male 10  2 243 days 06:18:00 
2  old 2015-06-04 12:34:00 female 2  3     NaT 
3  old 2015-09-04 23:03:00 female 3  3 92 days 10:29:00 
4  old 2015-04-21 12:59:00 female 6  3 -137 days +13:56:00 
5  old 2015-12-04 01:00:00 male 4  6     NaT 
6  old 2015-04-15 07:12:00 male 5  6 -233 days +06:12:00 
7  old 2015-06-05 11:12:00 male 9  6 51 days 04:00:00 
8  old 2015-05-19 19:22:00 male 12  6 -17 days +08:10:00 
9  old 2015-04-06 12:57:00 male 15  6 -44 days +17:35:00 
10 old 2015-06-15 03:23:00 male 17  6 69 days 14:26:00 
11 young 2015-12-05 14:19:00 female 11  4     NaT 
12 young 2015-05-27 22:31:00 female 13  4 -192 days +08:12:00 
13 young 2015-01-06 11:09:00 female 14  4 -142 days +12:38:00 
14 young 2015-06-19 05:37:00 female 18  4 163 days 18:28:00 

Ve bu beklediğiniz tam olarak ne. Ancak, groupby nesnesini iki kez (tam olarak aynı şekilde) oluşturmaya güveniyor gibi görünüyor.

import numpy as np 
import pandas as pd 

# Create dataframe consisting of id, date and two categories (gender and age) 
tempDF = pd.DataFrame({ 'id': [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20], 
         'date': ["02/04/2015 02:34","06/04/2015 12:34","09/04/2015 23:03","12/04/2015 01:00","15/04/2015 07:12","21/04/2015 12:59","29/04/2015 17:33","04/05/2015 10:44","06/05/2015 11:12","10/05/2015 08:52","12/05/2015 14:19","19/05/2015 19:22","27/05/2015 22:31","01/06/2015 11:09","04/06/2015 12:57","10/06/2015 04:00","15/06/2015 03:23","19/06/2015 05:37","23/06/2015 13:41","27/06/2015 15:43"], 
         'gender': ["male","female","female","male","male","female","female",np.nan,"male","male","female","male","female","female","male","female","male","female",np.nan,"male"], 
         'age': ["young","old","old","old","old","old",np.nan,"old","old","young","young","old","young","young","old",np.nan,"old","young",np.nan,np.nan]}) 

# Convert date to datetime 
tempDF['date'] = pd.to_datetime(tempDF['date']) 

# Create groupby object based on two categorical variables 
tempGroupby = tempDF.sort_values(['gender','age','id']).groupby(['gender','age']) 

# Count number in each group and merge with original dataframe to create 'count' column 
tempCountsDF = tempGroupby['id'].count().reset_index(drop=False) 
tempCountsDF = tempCountsDF.rename(columns={'id': 'count'}) 
tempDF = tempDF.merge(tempCountsDF, on=['gender','age']) 

# Calculate difference between consecutive rows in each group. (First row in each 
# group should have date difference = NaT) 
# ****** THIS TIME THE FOLLOWING GROUPBY DEFINITION IS COMMENTED OUT ***** 
# tempGroupby = tempDF.sort_values(['gender','age','id']).groupby(['gender','age']) 
tempDF['diff'] = tempGroupby['date'].diff() 
print(tempDF) 

Ve çıkışı (ve NOT ben hiç ne istediğini)

çok farklı bu sefer: İkinci GroupBy tanımı dışarı yorumladı ise, çok farklı bir fark sütununda çıkışına yol görünüyor
 age    date gender id count    diff 
0 young 2015-02-04 02:34:00 male 1  2     NaT 
1 young 2015-10-05 08:52:00 male 10  2     NaT 
2  old 2015-06-04 12:34:00 female 2  3 92 days 10:29:00 
3  old 2015-09-04 23:03:00 female 3  3     NaT 
4  old 2015-04-21 12:59:00 female 6  3 -233 days +06:12:00 
5  old 2015-12-04 01:00:00 male 4  6 -137 days +13:56:00 
6  old 2015-04-15 07:12:00 male 5  6     NaT 
7  old 2015-06-05 11:12:00 male 9  6     NaT 
8  old 2015-05-19 19:22:00 male 12  6 51 days 04:00:00 
9  old 2015-04-06 12:57:00 male 15  6 243 days 06:18:00 
10 old 2015-06-15 03:23:00 male 17  6     NaT 
11 young 2015-12-05 14:19:00 female 11  4 -17 days +08:10:00 
12 young 2015-05-27 22:31:00 female 13  4 -192 days +08:12:00 
13 young 2015-01-06 11:09:00 female 14  4 -142 days +12:38:00 
14 young 2015-06-19 05:37:00 female 18  4 -44 days +17:35:00 

(benim gerçek hayattaki komut dosyasında sonuçları bazen çalışır ve bazen. Ama yukarıdaki senaryoda, farklı çıkışları sürekli meydana görünmüyor, biraz düzensiz görünmektedir.)

Groupby nesnesinin neyin gerekli olduğu konusunda yeniden oluşturulması neden gereklidir? ly, .diff() işlevini kullanmadan hemen önce aynı veri çerçevesi (ek bir sütun eklense de) hemen? Bu benim için çok tehlikeli görünüyor.

+0

'' tempDF' değiştirdiniz ve ikinci '' groupby'' değiştirilen veri karesinde hesaplanıyor. Şüpheliyim, bu yüzden ikisinin sonuçları farklı. – jakevdp

cevap

2

Aynı değil, dizin değişti.

tempDF.loc[1].id # before 

10 

tempDF.loc[1].id # after 

2 

Yani bunu yaparken tempDF dizinleri değiştirmek sonra eski tempDF ile tempGroupby hesaplamak ve eğer: Örneğin:

tempDF['diff'] = tempGroupby['date'].diff() 

beklediğiniz gibi endeksler uyuşmuyor. Her bir satıra, eski tempDF'da bu dizine sahip olan satıra karşılık gelen farkı atamaktasınız.

+1

Teşekkürler Goyo. Bu kesinlikle bana doğru yönde işaret etti. .merge() kullandığımda, dizinin korunacağını düşündüm, ancak sütunları sütunlara eklerken (birleştirme işlevinde on = [] kullanarak yaptığım gibi), dizinler yok sayılır. dokümanlardaki). Dizin korunursa dizinine indeksle veya indisle indekslenir. – user1718097