2017-04-04 3 views
2

Ich habe df mit Spaltennamen: 'a', 'b', 'c' ... 'z'.Python pandas -> wählen Sie durch Bedingung in Spalten Name

print(my_df.columns) 
Index(['a', 'b', 'c', ... 'y', 'z'], 
    dtype='object', name=0) 

Ich habe Funktion, die bestimmen, welche Spalten angezeigt werden sollten. Zum Beispiel:

start = con_start() 
stop = con_stop() 
print(my_df.columns >= start) & (my_df <= stop) 

Mein Ergebnis ist:

[False False ... False False False False True True 
True True False False] 

Mein Ziel ist es Display Datenrahmen nur mit Spalten, die meine Bedingung erfüllen. Wenn = 'a' und Stop = 'b' beginnen, möchte ich haben:

0          a    b   
index1  index2             
New York  New York   0.000000  0.000000   
California Los Angeles 207066.666667 214466.666667  
Illinois  Chicago  138400.000000 143633.333333  
Pennsylvania Philadelphia 53000.000000 53633.333333  
Arizona  Phoenix  111833.333333 114366.666667 

Antwort

2

ich diese robust und mit so wenig Annahmen wie möglich machen will.

Option 1
Verwendung iloc mit Array-Slicing
Annahmen:

  • my_df.columns.is_unique ausgewertet True
  • Säulen sind bereits um

start = df.columns.get_loc(con_start()) 
stop = df.columns.get_loc(con_stop()) 

df.iloc[:, start:stop + 1] 

Option 2
Verwendung loc mit boolean Aufschneiden
Annahmen:

  • Spaltenwerte sind vergleichbar

start = con_start() 
stop = con_stop() 

c = df.columns.values 
m = (start <= c) & (stop >= c) 

df.loc[:, m] 
7

Sie schneiden können verwenden diese mit .loc zu erreichen:

df.loc[:,'a':'b'] 
0

eine Liste von colums generieren zu Anzeige:

cols = [x for x in my_df.columns if start <= x <= stop] 

Verwenden Sie nur diese Spalten in Ihrem Datenrahmen:

my_df[cols] 
0

vorausgesetzt result ist Ihre [true/false] Array und dass letters ist [a...z]:

res=[letters[i] for i,r in enumerate(result) if r] 
new_df=df[res] 
0

Wenn sind Ihre Bedingungen auf einem ähnlichen Niveau an Komplexität, wie Sie in Ihrem Beispiel gezeigt, dass es keine Notwendigkeit, eine zusätzliche Funktion zu verwenden, sondern nur noch das Filtern z.B.

sweet_and_red_fruit = fruit[(fruit[sweet == 1) & (fruit["colour"] == "red")] 
print(sweet_and_red_fruit) 

oder wenn Sie wollen nur

print(fruit[(fruit[sweet == 1) & (fruit["colour"] == "red")]) 
drucken
Verwandte Themen