首页 > 解决方案 > 如何删除列表中包含部分字符串的所有列

问题描述

我有一个数据框,其中的列是每月数据,例如 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')]]

标签: pythonpandas

解决方案


为了满足您的要求,您可以创建一个函数,给定列确定哪些是“季度”月。例子:

> 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

另一种方法是创建一个多次应用“endswith”函数的函数。例子:

> 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

推荐阅读