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
nie dostanę kod. co tam jest. i czy przetestowałeś kod, proszę o wyjaśnienia. –
'c.startswith ('d')' jest prawdopodobnie bardziej pythonic. Tak czy inaczej to lubię! –
To bardzo wolno. Podejście wektoryzacji byłoby bardzo korzystne. – devinbost