2016-06-30 28 views
3

Ich habe einen Datenrahmen:Pandas Python, wählen Sie Spalten basierend auf Reihen Bedingungen

import pandas as pd 
df = pd.DataFrame(np.random.randn(2, 4)) 
print(df) 
      0   1   2   3 
0 1.489198 1.329603 1.590124 1.123505 
1 0.024017 0.581033 2.500397 0.156280 

Ich möchte die Spalten auszuwählen, die für mindestens eine Zeile mit einem Wert von mehr als 2 ist. Ich habe Folgendes versucht, aber es hat nicht wie erwartet funktioniert.

df[df.columns[df.iloc[(0,1)]>2]] 

In diesem Spielzeug Beispiel meine erwartete Ausgabe wäre:

 2 
1.590124 
2.500397 

Antwort

3

Verwenden gt und any die df filtern:

In [287]: 
df.ix[:,df.gt(2).any()] 

Out[287]: 
      2 
0 1.590124 
1 2.500397 

Hier verwenden wir ix alle Zeilen auszuwählen, die erste : und die nächste arg ist ein boolean Maske die Spalten, die die Bedingung erfüllen:

In [288]: 
df.gt(2) 

Out[288]: 
     0  1  2  3 
0 False False False False 
1 False False True False 

In [289]: 
df.gt(2).any() 

Out[289]: 
0 False 
1 False 
2  True 
3 False 
dtype: bool 

In Ihrem Beispiel, was Sie getan haben, war die Zelle va auswählen lue für die erste Zeile und zweiten Spalte Sie dann versucht, dies zu verwenden, um die Spalten zu maskieren, aber diese sind gerade die erste Spalte also warum es nicht funktioniert:

In [291]: 
df.iloc[(0,1)] 

Out[291]: 
1.3296030000000001 

In [293]: 
df.columns[df.iloc[(0,1)]>2] 

Out[293]: 
'0' 
+0

Downvoter Pflege zu erklären? – EdChum

+0

Ok thkx an euch beide, weiß jemand, was mein Skript tun soll? –

+0

diese 'df.iloc [(0,1)]' wählte die erste Zeile und die zweite Spalte Zellenwert und getestet, wenn es größer als 2 war, was es nicht ist, so wird es nicht funktionieren – EdChum

1

Verwenden mask erstellt mit df > 2 mit any und dann Spalten auswählen, indem ix:

import pandas as pd 
np.random.seed(18) 
df = pd.DataFrame(np.random.randn(2, 4)) 
print(df) 
      0   1   2   3 
0 0.079428 2.190202 -0.134892 0.160518 
1 0.442698 0.623391 1.008903 0.394249 

print ((df>2).any()) 
0 False 
1  True 
2 False 
3 False 
dtype: bool 

print (df.ix[:, (df>2).any()]) 
      1 
0 2.190202 
1 0.623391 

EDIT von Kommentar:

Y ou kann Ihre Lösung per partes überprüfen:

Es scheint, es funktioniert, aber es ist immer zweite Spalte auswählen (1, Python Zählung von 0) Spalte, wenn die Bedingung True:

print (df.iloc[(0,1)]) 
2.19020235741 

print (df.iloc[(0,1)] > 2) 
True 

print (df.columns[df.iloc[(0,1)]>2]) 
1 

print (df[df.columns[df.iloc[(0,1)]>2]]) 
0 2.190202 
1 0.623391 
Name: 1, dtype: float64 

Und erste Säule (0) Spalte wenn False, weil boolean True und False sind 1 gegossen und 0:

np.random.seed(15) 
df = pd.DataFrame(np.random.randn(2, 4)) 
print (df) 
      0   1   2   3 
0 -0.312328 0.339285 -0.155909 -0.501790 
1 0.235569 -1.763605 -1.095862 -1.087766 

print (df.iloc[(0,1)]) 
0.339284706046 

print (df.iloc[(0,1)] > 2) 
False 

print (df.columns[df.iloc[(0,1)]>2]) 
0 

print (df[df.columns[df.iloc[(0,1)]>2]]) 
0 -0.312328 
1 0.235569 
Name: 0, dtype: float64 

Wenn ändern Spaltennamen:

np.random.seed(15) 
df = pd.DataFrame(np.random.randn(2, 4)) 
df.columns = ['a','b','c','d'] 
print (df) 
      a   b   c   d 
0 -0.312328 0.339285 -0.155909 -0.501790 
1 0.235569 -1.763605 -1.095862 -1.087766 

print (df.iloc[(0,1)] > 2) 
False 

print (df[df.columns[df.iloc[(0,1)]>2]]) 
0 -0.312328 
1 0.235569 
Name: a, dtype: float64 
+0

Ok thkx an euch beide, weiß jemand, was mein Skript soll tun? –

+0

Ich versuche es anhand von Beispielen zu erklären, bitte überprüfen Sie es. – jezrael

+0

thx viel jezrael –

Verwandte Themen