2017-02-07 29 views
8

Próbowałem zastosować rozwiązanie dostarczone w tym pytaniu do moich rzeczywistych danych: Selecting rows in a MultiIndexed dataframe. Jakoś nie mogę uzyskać wyników, które powinien dać. Dołączyłem zarówno ramkę danych do wyboru, jak i wynik.Niepoprawne wyniki podczas stosowania rozwiązania do rzeczywistych danych

Czego potrzebuję;

Wiersze 3, 11 i 12 powinny zostać zwrócone (po dodaniu kolejnych 4 kolumn należy wybrać również 12. Nie jest to teraz).

df_test = pd.read_csv('df_test.csv') 

    def find_window(df): 
     v = df.values 
     s = np.vstack([np.zeros((1, v.shape[1])), v.cumsum(0)]) 

     threshold = 0 

     r, c = np.triu_indices(s.shape[0], 1) 
     d = (c - r)[:, None] 
     e = s[c] - s[r] 
     mask = (e/d < threshold).all(1) 
     rng = np.arange(mask.shape[0]) 

     if mask.any(): 
      idx = rng[mask][d[mask].argmax()] 

      i0, i1 = r[idx], c[idx] 
      return pd.DataFrame(
       v[i0:i1], 
       df.loc[df.name].index[i0:i1], 
       df.columns 
      ) 

    cols = ['2012', '2013', '2014', '2015'] 

    df_test.groupby(level=0)[cols].apply(find_window) 

csv_file jest tutaj: https://docs.google.com/spreadsheets/d/19oOoBdAs3xRBWq6HReizlqrkWoQR2159nk8GWoR_4-g/edit?usp=sharing

EDIT: dodano Prawidłowe dataframes. enter image description here

enter image description here

Uwaga: niebieski ramy = rzędów, które powinny być zwracane, żółty ramek znajduje się kolejne wartości kolumn, które są < 0 (próg).

+1

nie wydaje się być tabelą z wieloma indeksami; Czy możesz wyjaśnić swoje kryterium, aby wybrać wiersze? –

+1

Twój kod jest dla mnie trudny do odczytania. Czy możesz po prostu wyjaśnić logikę utrzymania każdego wiersza w prostym języku angielskim. Czy to ostatnia karta danych, której oczekiwałeś? –

+0

@ted, wyjaśnienie kodu znajduje się w innym pytaniu, o którym wspomniałem. Ostatnia ramka danych jest teraz dostępna, jednak wiersz 12 również powinien powrócić. Kryteria to kolumna 2012 .... 2015 muszą być poniżej 0, indywidualnie lub kolejno połączone. – Zanshin

Odpowiedz

0

Zgodnie z logiką z Twojego komentarza szukasz wierszy, które mają każdą wartość w kolumnach 2012,2013,2014,2015 mniej niż 0 lub mają skumulowaną sumę mniejszą niż 0. Ponieważ pierwszy warunek zawsze będzie prawdziwy, gdy drugi warunek jest prawdziwy, wystarczy przetestować drugi warunek.

cols = ['2012', '2013', '2014', '2015'] 
df.loc[(df[cols].cumsum(axis=1) < 0).all(axis=1), cols] 

    2012 2013 2014 2015 
1 -6.74 -1.22 1.58 -0.42 
3 -3.14 -2.48 -0.02 -4.78 
4 -9.40 -11.20 0.68 12.04 
7 -3.12 -5.74 0.84 1.94 
8 -10.14 -12.24 -11.10 15.20 
11 -10.04 -10.60 -5.56 -8.44 
12 -7.30 5.96 -12.58 -6.86 
15 -10.24 -4.16 5.46 -14.00 

Poinformuj mnie w komentarzach, jeśli nie tego chcesz.

+0

skumulowana kolumna mądra, nie na wiersz. Proszę spojrzeć na inne wymienione pytanie. – Zanshin