Załóżmy, że mam następującą ramkę danych:

          a         b         c         d 
0  0.049531  0.408824  0.975756  0.658347
1  0.981644  0.520834  0.258911  0.639664
2  0.641042  0.534873  0.806442  0.066625
3  0.764057  0.063252  0.256748  0.045850

I chcę tylko podzbiór kolumn, których wartość w wierszu 0 jest większa niż 0,5. Mogę to zrobić:

df2 = df.T
myResult = df2[df2.iloc[:, 0] > 0.5].T

Ale to czuje się jak okropny hack. Czy istnieje ładniejszy sposób, aby zrobić indeksowanie boolowskie wzdłuż kolumn? Gdzieś mogę określić argument osi?

2
MorganM 13 sierpień 2014, 00:06

3 odpowiedzi

Najlepsza odpowiedź

Co powiesz na to?

df.loc[:, df.iloc[0, :] > 0.5]
6
Artur Nowak 18 sierpień 2017, 18:37

Inną metodą bez użycia transpozycji jest utworzenie maski boolowskiej, czy pierwszy wiersz ma wartości większe niż 0,5, a następnie upuścić NAN z progiem, a następnie wreszcie wykonaj listę kolumn DF do filtrowania oryginalnego DF. Jest to dość zaciemnione;)

In [76]:

df[list(df[df.head(1)> 0.5].dropna(thresh=1, axis=1))]
Out[76]:
              c         d
index                    
0      0.975756  0.658347
1      0.258911  0.639664
2      0.806442  0.066625
3      0.256748  0.045850
1
EdChum 12 sierpień 2014, 20:32

Inny sposób patrzenia na twoją odpowiedź:

In [14]: df.T[df.T[0] > 0.5].T
Out[14]: 
          c        d 
0  0.975756  0.658347
1  0.258911  0.639664
2  0.806442  0.066625
3  0.256748  0.045850
0
ericmjl 12 sierpień 2014, 20:12