Как удалить все столбцы, но не первый, который начинается с шаблона? - PullRequest
1 голос
/ 17 апреля 2020

У меня есть код, который удаляет все столбцы, которые начинаются с spike:

import pandas as pd

data = {'spike_starts1': [1,2,3], 'spike_starts2': [4,5,6], 'spike_starts3': [7,8,9], 'not': [10,11,12]}
df = pd.DataFrame(data)

df2 = df.drop(df.columns[df.columns.str.contains(pat = '^spike')].tolist() , axis=1).copy()

Вопрос: Как изменить код выше, чтобы он оставлял первый столбец, начинающийся с spike но удалить все остальные, которые начинаются с spike? Если приведенный выше код трудно изменить, предложите свои версии.

Ответы [ 2 ]

2 голосов
/ 17 апреля 2020

Этого можно достичь, просто изменив .tolist()[1:], окончательный код должен выглядеть следующим образом:

import pandas as pd

data = {'spike_starts1': [1,2,3], 'spike_starts2': [4,5,6], 'spike_starts3': [7,8,9], 'not': [10,11,12]}
df = pd.DataFrame(data)

df2 = df.drop(df.columns[df.columns.str.contains(pat = '^spike')].tolist()[1:] , axis=1).copy()
1 голос
/ 17 апреля 2020

Вы можете создать флаг всплеска и отбросить дубликаты, в которых останется только первый.

(
    df.T.assign(flag=lambda x: x.index.str.slice(0,5))
    .drop_duplicates(subset='flag')
    .drop('flag',1)
    .T
)

    spike_starts1   not
0   1               10
1   2               11
2   3               12

Из вас можно создать дикт только с первым столбцом всплесков и другими столбцами без всплесков.

(
    pd.DataFrame({'spike' if c.startswith('spike') else c:df[c] for c in df.columns})
    .rename(columns = {'spike': [e for e in df.columns if e.startswith('spike')][0]})
)

Другое решение:

(
    pd.DataFrame(df.columns)
    .assign(F=lambda x: x[0].str[:5])
    .drop_duplicates(subset='F')
    .pipe(lambda x: df.reindex(columns=x[0]))
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...