2013-04-15 11 views
5

Pracuję nad kilkoma zestawami danych taksówek. Użyłem pand, aby połączyć wszystkie zbiory danych w jedną ramkę danych.Aby wyodrębnić wartości inne niż nan z wielu wierszy w ramce danych o pandach

Moja ramka danych wygląda mniej więcej tak.

     675      1039    #and rest 125 taxis 
        longitude  latitude longitude latitude 
date 
2008-02-02 13:31:21 116.56359 40.06489  Nan   Nan 
2008-02-02 13:31:51 116.56486 40.06415  Nan   Nan 
2008-02-02 13:32:21 116.56855 40.06352  116.58243 39.6313 
2008-02-02 13:32:51 116.57127 40.06324  Nan   Nan 
2008-02-02 13:33:21 116.57120 40.06328  116.55134 39.6313 
2008-02-02 13:33:51 116.57121 40.06329  116.55126 39.6123 
2008-02-02 13:34:21 Nan  Nan   116.55134 39.5123 

gdzie 675,1039 to numery identyfikacyjne taksówek. Zasadniczo istnieją tu całkowicie 127 taksówek, których odpowiadające im szerokości i długości geograficzne są połączone w górę.

Mam kilka sposobów na wyodrębnienie wartości niepustych dla wiersza.

df.ix[k,df.columns[np.isnan(df.irow(0))!=1]] 
       (or) 
df.irow(0)[np.isnan(df.irow(0))!=1] 
       (or) 
df.irow(0)[np.where(df.irow(0)[df.columns].notnull())[0]] 

któregokolwiek z powyższych poleceń wróci

675 longitude 116.56359 
     latitude  40.064890 
4549 longitude 116.34642 
     latitude  39.96662 
Name: 2008-02-02 13:31:21 

teraz Aby wyodrębnić wszystkie wartości notnull z kilku pierwszych rzędach (powiedzmy z rzędu 1 do rzędu 6).

jak to zrobić?

Prawdopodobnie mogę go zapętlić. Ale chcę mieć niezapętlony sposób robienia tego.

Każda pomoc, sugestie są mile widziane. Dzięki za przysł. :)

Odpowiedz

4
df.ix[1:6].dropna(axis=1) 

jako heads-up, irow zostanie wycofany w kolejnej wersji pandy. Nowe metody, z bardziej przejrzystym użyciem, zastąp je.

http://pandas.pydata.org/pandas-docs/dev/indexing.html#deprecations

+0

Dziękuję bardzo za informacje. Ale najwyraźniej polecenie, o którym wspomniałeś, nie jest tym, co chcę :(:(z rzędu, muszę wyodrębnić wszystkie wartości notnull. => Dla kilku wierszy, bez iteracji, czy mogę to zrobić w bardziej zwarty sposób to pytanie. tyle, że odpowiadasz :) – user2179627

2

W 0.11 (0.11rc1 znajduje się teraz), to jest bardzo łatwe przy użyciu .iloc aby wybrać pierwszego z 6 rzędów, a następnie dropna spada dowolny wiersz z nan (można również przekazać niektóre opcje dropna aby dokładnie kontrolować, które kolumny, które mają być brane pod uwagę)

zdałem sobie sprawę, chcesz 1: 6, zrobiłem 0: 6 w mojej odpowiedzi ....

In [8]: df = DataFrame(randn(10,3),columns=list('ABC'),index=date_range('20130101',periods=10)) 

In [9]: df.ix[6,'A'] = np.nan 

In [10]: df.ix[6,'B'] = np.nan 

In [11]: df.ix[2,'A'] = np.nan 

In [12]: df.ix[4,'B'] = np.nan 

In [13]: df.iloc[0:6] 
Out[13]: 
        A   B   C 
2013-01-01 0.442692 -0.109415 -0.038182 
2013-01-02 1.217950 0.006681 -0.067752 
2013-01-03  NaN -0.336814 -1.771431 
2013-01-04 -0.655948 0.484234 1.313306 
2013-01-05 0.096433  NaN 1.658917 
2013-01-06 1.274731 1.909123 -0.289111 

In [14]: df.iloc[0:6].dropna() 
Out[14]: 
        A   B   C 
2013-01-01 0.442692 -0.109415 -0.038182 
2013-01-02 1.217950 0.006681 -0.067752 
2013-01-04 -0.655948 0.484234 1.313306 
2013-01-06 1.274731 1.909123 -0.289111 
+0

Nie, to nie jest to, czego chcę.Na przykład, 2013-01-03 kolumny wiersza B i C. są potrzebne.Nie należy brać pod uwagę tylko tych kolumn z wartościami Nan, ale naprawdę dziękuję za sugestię – user2179627

+0

Jeśli chcesz tylko uwzględnić podzbiór kolumn, spróbuj '' dropna (podzbiór = ['C']) '' – Jeff

0

Korzystanie dataframe Jeffa:

import pandas as pd 
from numpy.random import randn 

df = pd.DataFrame(randn(10,3),columns=list('ABC'),index=pd.date_range('20130101',periods=10)) 
df.ix[6,'A'] = np.nan 
df.ix[6,'B'] = np.nan 
df.ix[2,'A'] = np.nan 
df.ix[4,'B'] = np.nan 

Możemy zastąpić Nans przez pewną liczbę wiemy nie jest w dataframe:

df = df.fillna(999) 

Jeśli chcesz zachować tylko wartości nie zerowe bez iteracji można zrobić:

df_nona = df.apply(lambda x: list(filter(lambda y: y != 999, x))) 
df_na = df.apply(lambda x: list(filter(lambda y: y == 999, x))) 

Problem z tym podejściem polega na tym, że wynikiem są listy, co powoduje utratę informacji o indeksie.

df_nona 
A [-1.9804955861, 0.146116306853, 0.359075672435... 
B [-1.01963803293, -0.829747654648, 0.6950551455... 
C [2.40122968044, 0.79395493777, 0.484201174184,... 
dtype: object 

Inną opcją jest:

df1 = df.dropna() 
index_na = df.index^df1.index 
df_na = df[index_na] 

W tym przypadku nie stracić informacje o indeksie, choć jest to bardzo podobne do poprzednich odpowiedzi.

Mam nadzieję, że pomoże!

Powiązane problemy