2015-06-12 11 views

Odpowiedz

46

można użyć DataFrame.filter ten sposób:

import pandas as pd 

df = pd.DataFrame(np.array([[2,4,4],[4,3,3],[5,9,1]]),columns=['d','t','didi']) 
>> 
    d t didi 
0 2 4  4 
1 4 3  3 
2 5 9  1 

df.filter(regex=("d.*")) 

>> 
    d didi 
0 2  4 
1 4  3 
2 5  1 

Chodzi o to, aby wybrać kolumny przez regex

4

Można użyć funkcji sprawdzania list do iterowania wszystkich nazw kolumn w DataFrame df, a następnie wybierać tylko te, które zaczynają się od "d".

df = pd.DataFrame({'a': {0: 10}, 'b': {0: 14}, 'c': {0: 12}, 
        'd1': {0: 44}, 'd2': {0: 45}, 'd3': {0: 78}}) 

Zastosowanie listowego iteracyjne nad kolumn w dataframe i powrót ich nazwy (c poniżej jest lokalna zmienna reprezentująca nazwy kolumny).

>>> [c for c in df] 
['a', 'b', 'c', 'd1', 'd2', 'd3'] 

Następnie wybieraj tylko te rozpoczynające się od "d".

>>> [c for c in df if c[0] == 'd'] # As an alternative to c[0], use c.startswith(...) 
['d1', 'd2', 'd3'] 

Na koniec przekazać tę listę kolumn do DataFrame.

df[[c for c in df if c.startswith('d')]] 
>>> df 
    d1 d2 d3 
0 44 45 78 

=========================================== ================================

taktowania (dodany lut 2018 za komentarzy devinbost twierdząc, że ten metoda ta jest powolna ...)

Po pierwsze, pozwala stworzyć dataframe z 30k kolumnach:

n = 10000 
cols = ['{0}_{1}'.format(letters, number) 
     for number in range(n) for letters in ('d', 't', 'didi')] 
df = pd.DataFrame(np.random.randn(3, n * 3), columns=cols) 
>>> df.shape 
(3, 30000) 

>>> %timeit df[[c for c in df if c[0] == 'd']] # Simple list comprehension. 
# 10 loops, best of 3: 16.4 ms per loop 

>>> %timeit df[[c for c in df if c.startswith('d')]] # More 'pythonic'? 
# 10 loops, best of 3: 29.2 ms per loop 

>>> %timeit df.select(lambda col: col.startswith('d'), axis=1) # Solution of gbrener. 
# 10 loops, best of 3: 21.4 ms per loop 

>>> %timeit df.filter(regex=("d.*")) # Accepted solution. 
# 10 loops, best of 3: 40 ms per loop 
+0

nie dostanę kod. co tam jest. i czy przetestowałeś kod, proszę o wyjaśnienia. –

+1

'c.startswith ('d')' jest prawdopodobnie bardziej pythonic. Tak czy inaczej to lubię! –

+0

To bardzo wolno. Podejście wektoryzacji byłoby bardzo korzystne. – devinbost

11

użytkowania select:

import pandas as pd 

df = pd.DataFrame([[10, 14, 12, 44, 45, 78]], columns=['a', 'b', 'c', 'd1', 'd2', 'd3']) 

df.select(lambda col: col.startswith('d'), axis=1) 

Wynik:

d1 d2 d3 
0 44 45 78 

Jest to miłe rozwiązanie, jeśli nie jesteś dobrze z wyrażenia regularne.

0

Można również użyć

df.filter(regex='^d') 
Powiązane problemy