2016-04-01 33 views
1

Yöntemi, here'dan çok indeksli bir veri çerçevesine uyguladığınızda, işe yaramıyor gibi görünmektedir. endekslemeBirden çok dizinli veri çerçevesinden tamamlanmamış mevsimleri kaldırma (pandalar)

için 'Yılın' sütunu oluşturun uygula işlevini

df['Season'] = df.apply(get_season, axis=1) 

import pandas as pd 
import numpy as np 

dates = pd.date_range('20070101',periods=3200) 
df = pd.DataFrame(data=np.random.randint(0,100,(3200,1)), columns =list('A')) 
df['A'][5,6,7, 8, 9, 10, 11, 12, 13] = np.nan #add missing data points 
df['date'] = dates 
df = df[['date','A']] 

datetime indeksi

def get_season(row): 
    if row['date'].month >= 3 and row['date'].month <= 5: 
     return '2' 
    elif row['date'].month >= 6 and row['date'].month <= 8: 
     return '3' 
    elif row['date'].month >= 9 and row['date'].month <= 11: 
     return '4' 
    else: 
     return '1' 

için sezon işlevini uygulayın:

bir veri çerçevesi atın Her sezon

count = df.groupby(level=[0, 1]).count() 

Bırak içinde

Yıl Çok endeks ve Sezon

df = df.set_index(['Year', 'Season'], inplace=False) 

Sayım veri noktası içlerinde az 75 gün mevsimler

count = count.drop(count[count.A < 75].index) 

bir değişken oluşturma Mevsimler için 75 günden fazla olan süre

isin işlevinin kullanılması
complete = count[count['A'] >= 75].index 

Ben

df = df.isin(complete) 
df 

Her değer false çıkageldi 'A' geçerli fazla veri 75 gün var her mevsim seçmek isterken, her şey için yanlış geliyor, ve Nedenini göremiyorum.

Umarım bu yeterince kısadır, bunu mevsimi kullanarak bir çoklu indekste çalışmak için buna ihtiyacım var. Çoklu dizin here

df3 = df.reset_index().groupby('Year').apply(lambda x: x.set_index('Season').reindex(count,method='pad')) 

DÜZENLEME 2

(aynı zamanda boş dataframe üreten) çalışmıyor yeniden dizin göre

DÜZENLEME

diğer bir yöntem, aynı zamanda, bu

çalıştı
seasons = count[count['A'] >= 75].index 

df = df[df['A'].isin(seasons)] 

Yine boş çıktı

+1

Ben 'yağmur' 'A' olması gerektiğini düşünüyorum? – JohnE

+1

Böyle bir şey yapmak istediğinden şüpheleniyorum? 'say = df [df.A> 75] .grup (seviye = [0, 1]). count()'. Bu size 75 gün süre veriyor. Bundan sonra, birleştirme veya birleştirme kullanmak istediğinizden şüpheliyim, değil. – JohnE

+0

@John Evet, 'A' olmalı - bu konuda üzgünüm. – Pad

cevap

1

Sana Index.isin kullanabilirsiniz düşünüyorum:

complete = count[count['A'] >= 75].index 


idx = df.index.isin(complete) 
print idx 
[ True True True ..., False False False] 

print df[idx] 
    date  A 
Year Season     
2007 1  2007-01-01 24.0 
    1  2007-01-02 92.0 
    1  2007-01-03 54.0 
    1  2007-01-04 91.0 
    1  2007-01-05 91.0 
    1  2007-01-06 NaN 
    1  2007-01-07 NaN 
    1  2007-01-08 NaN 
    1  2007-01-09 NaN 
    1  2007-01-10 NaN 
    1  2007-01-11 NaN 
    1  2007-01-12 NaN 
    1  2007-01-13 NaN 
    1  2007-01-14 NaN 
    1  2007-01-15 18.0 
    1  2007-01-16 82.0 
    1  2007-01-17 55.0 
    1  2007-01-18 64.0 
    1  2007-01-19 89.0 
    1  2007-01-20 37.0 
    1  2007-01-21 45.0 
    1  2007-01-22 4.0 
    1  2007-01-23 34.0 
    1  2007-01-24 35.0 
    1  2007-01-25 90.0 
    1  2007-01-26 17.0 
    1  2007-01-27 29.0 
    1  2007-01-28 58.0 
    1  2007-01-29 7.0 
    1  2007-01-30 57.0 
...    ... ... 
2015 3  2015-08-02 42.0 
    3  2015-08-03 0.0 
    3  2015-08-04 31.0 
    3  2015-08-05 39.0 
    3  2015-08-06 25.0 
    3  2015-08-07 1.0 
    3  2015-08-08 7.0 
    3  2015-08-09 97.0 
    3  2015-08-10 38.0 
    3  2015-08-11 59.0 
    3  2015-08-12 28.0 
    3  2015-08-13 84.0 
    3  2015-08-14 43.0 
    3  2015-08-15 63.0 
    3  2015-08-16 68.0 
    3  2015-08-17 0.0 
    3  2015-08-18 19.0 
    3  2015-08-19 61.0 
    3  2015-08-20 11.0 
    3  2015-08-21 84.0 
    3  2015-08-22 75.0 
    3  2015-08-23 37.0 
    3  2015-08-24 40.0 
    3  2015-08-25 66.0 
    3  2015-08-26 50.0 
    3  2015-08-27 74.0 
    3  2015-08-28 37.0 
    3  2015-08-29 19.0 
    3  2015-08-30 25.0 
    3  2015-08-31 15.0 

[3106 rows x 2 columns] 
+0

Teşekkürler, bu doğru değişkenleri 'Doğru' ve 'Yanlış' ile tanımlamaktadır (ilk sezon 'Yanlış' diye bir çok eksik değere sahiptir). Fakat 'print idx [df]' yi kullanarak uyguladığımda, sadece tüm dataframe'leri geri getiriyor ve sezonları 75 günden daha kısa bir süre içinde atlamıyor. – Pad

+0

Hmmm df yazdıysa 3200 satır var, eğer print df [idx] 'ise 3106 satır var. Bu yüzden 94 satırın kaldırıldığını düşünüyorum. Ama daha iyi nasıl kontrol edebileceğimi bilmiyorum. Ne düşünüyorsun? – jezrael

+0

Üzgünüm, çekirdeği yeniden başlatmamıştım ve değişkenlerden birinde bir aksaklık vardı, bu işe yarar, teşekkürler! – Pad

İlgili konular