2017-05-11 3 views
1

Hallo Leute Ich habe dieses einfache Problem, wo ich versuche, die Iloc Zeilenposition aller NaN-Feld in einem Datenrahmen (Spalte B) zu finden. Bisher bin ich die Lösung des Problems die folgende Art und Weise:Python: Get Position in Pandas Datenrahmen

rng= ['AA', 'BB', 2, 3, 4, 5] 
df1 = pd.DataFrame(np.random.randn(6, 3), index=rng, columns=['A', 'B', 'C']) 
df1.iloc[1][1]= np.nan 

+----------------------------------+ 
|   A   B   C | 
+----------------------------------+ 
| AA 0.198267 -1.469309 -1.751756 | 
| BB -1.376388  Nan 0.988391 | 
| 2 -1.697636 -0.814975 0.614170 | 
| 3 -1.187977 1.240791 -1.079049 | 
| 4 -1.495139 0.215619 -1.572205 | 
| 5 1.157736 -0.656647 -0.307207 | 
+----------------------------------+ 

ind_com=df1.loc[df1.B.isnull()].index.values.tolist() 
ind_list=[] 
for ii in ind_com: 
    ind_list.append(df_temp.index.get_loc(ii)) 

ind_list = 1 Es muss doch einen besseren Weg geben. Danke

Antwort

2

Ich glaube, Sie brauchen:

pos = [df1.index.get_loc(x) for x in df1.index[df1.B.isnull()]] 

Eine andere Lösung mit numpy.where:

pos = np.where(df1.B.isnull().values)[0].tolist() 

Oder numpy.nonzero:

pos = np.nonzero(df1.B.isnull().values)[0].tolist() 
+0

Nun, es ist im Grunde das gleiche, dass ich nur in einer Zeile . Ich dachte, es gibt einen besseren Weg ohne die For-Schleife. – valenzio

+0

Ja, es gibt ein Problem 'get_loc' ist nicht für mehrere Indexwerte implementiert. Aber ich versuche eine Lösung zu finden. – jezrael

+0

Ich weiß, in Matlab ist es einfach, deshalb muss es auch für Pandas funktionieren, zumindest glaube ich. – valenzio

2

Werfen wir einen anderen Ansatz (kein Looping):

ind_list = np.where(df1.B.isnull().as_matrix())[0].tolist() 
print(ind_list) 
+0

Es ist falsch, weil 'iloc' Positionen benötigen. – jezrael

+0

'df1.iloc [0] [1] = np.nan' muss zurückgeben' 0, 2' – jezrael

+0

Ja, ich habe gerade festgestellt, dass – valenzio

1

Da die ILoc wirklich nur ein 0-indiziert Zeilennummer, sollte es zu Aufzählen über die NULL-Werte in der Spalte identisch sein:

[iloc for iloc, null in enumerate(df['B'].isnull()) if null] 
Verwandte Themen