Как удалить все столбцы, которые содержат часть строки в списке - PullRequest
0 голосов
/ 26 октября 2018

У меня есть датафрейм, где столбцы - это месячные данные, например 2000-01, 2000-02 ... 2015-12.

Мне нужно удалить все столбцы, которые не являются данными за квартал, то есть оставить только месяцы -01, -04, -07, -10 и отбросить все остальные месячные данные

Я попытался df1 = df[df.columns[~df.columns.str.endswith('02')]], что позволяет мне отбрасывать все столбцы, заканчивающиеся на 02.

Но я не хочу повторять этот код 8 раз за каждый месяц. Есть ли способ передать список и сделать так, чтобы код отбрасывал все столбцы, оканчивающиеся на любую строку из списка, например

df1 = df[df.columns[~df.columns.str.endswith('02','03','05,'06')]]

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Вы можете использовать логическую маску:

# construct dataframe with year-month columns
L = [f'{year}-{i:02}' for year in range(2000, 2016) for i in range(1, 13)]
df = pd.DataFrame(columns=L)

# calculate Boolean mask
# split by '-', take last split, convert to integer, then compare
col_mask = df.columns.str.split('-').str[-1].astype(int).isin([1, 4, 7, 10])

# apply Boolean mask and print columns
print(df.loc[:, col_mask].columns)

Index(['2000-01', '2000-04', '2000-07', '2000-10', '2001-01', '2001-04',
       '2001-07', '2001-10', '2002-01', '2002-04', '2002-07', '2002-10',
       '2003-01', '2003-04', '2003-07', '2003-10', '2004-01', '2004-04',
       '2004-07', '2004-10', '2005-01', '2005-04', '2005-07', '2005-10',
       '2006-01', '2006-04', '2006-07', '2006-10', '2007-01', '2007-04',
       '2007-07', '2007-10', '2008-01', '2008-04', '2008-07', '2008-10',
       '2009-01', '2009-04', '2009-07', '2009-10', '2010-01', '2010-04',
       '2010-07', '2010-10', '2011-01', '2011-04', '2011-07', '2011-10',
       '2012-01', '2012-04', '2012-07', '2012-10', '2013-01', '2013-04',
       '2013-07', '2013-10', '2014-01', '2014-04', '2014-07', '2014-10',
       '2015-01', '2015-04', '2015-07', '2015-10'],
      dtype='object')
0 голосов
/ 26 октября 2018

Чтобы удовлетворить ваши требования, вы можете создать функцию, которая по столбцам определяет, какие из них являются «квартальными» месяцами. Пример:

> def quarter_columns(cols):
      return [col for col in cols if int(col.split('-')[1]) % 3 == 1]
> df = pd.DataFrame({'2018-{0:02}'.format(month):[1] for month in range(1,8)})
> df
>       2018-01     2018-02     2018-03     2018-04     2018-05     2018-06     2018-07
    0   1           1           1           1           1           1           1
> df[quarter_columns(df.columns)]
>       2010-01     2010-04     2010-07
    0   1           1           1

Еще один способ сделать это - создать функцию, которая несколько раз применяет функцию «заканчивается». Пример:

> def multiple_endswith(cols, strs):
      return np.logical_or.reduce([df.columns.str.endswith(st) for st in strs])
> df[df.columns[~multiple_endswith(df.columns, ['02', '03', '05', '06', '08', '09', '11', '12'])]]
>       2010-01     2010-04     2010-07
    0   1           1           1
> df[df.columns[multiple_strends(df.columns, ['01', '04', '07', '10'])]]
>       2010-01     2010-04     2010-07
    0   1           1           1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...