python - 如何删除列表中包含部分字符串的所有列
问题描述
我有一个数据框,其中的列是每月数据,例如 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')]]
解决方案
为了满足您的要求,您可以创建一个函数,给定列确定哪些是“季度”月。例子:
> 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
推荐阅读
- list - 如何测试列表中所有字符的长度并调整输出的位置(基于长度?
- reactjs - ReactSearchBox 未从 Fetch 加载数组
- swift - 最新版本的照片库中是否不推荐使用 fetchAssetCollections 方法?
- c# - 绑定不适用于来自 Code-Behind 的克隆 UIElement
- arrays - NativeScript 在 ObservableArray 更改时更新 UI
- sql - SQL 按最小值和最大值记录聚合定价数据
- powershell - 如何在 PowerShell 中转义特殊字符?
- c# - 如何创建以随机间隔发射项目的无限 Observable 序列?
- c++ - 头文件问题;“重新定义阶级”
- apache - Installing multiple RSA SSL certificates with Apache for one website