我有一个列名的dataframe,如下所示
import pandas as pd
data = [['30-06-2021', 3.4, 43578, '31-01-2022', 5000, '28-02-2022', 78564, '31-03-2022', 52353, '30-04-2022'],
['14-06-2021', 8.9, 4475, '14-01-2022', 2546, '05-02-2022', 5757, '28-03-2022', 2352, '01-04-2022']]
ds = pd.DataFrame(data, columns = ['Start', 'Rate', 'Jan-22Total', 'Jan-22', 'Feb-22Total', 'Feb-22', 'Mar-22Total', 'Mar-22',
'Apr-22Total', 'Apr-22'])
Start Rate Jan-22Total Jan-22 Feb-22Total Feb-22 Mar-22Total Mar-22 Apr-22Total Apr-2
0 30-06-2021 3.4 43578 31-01-2022 5000 28-02-2022 78564 31-03-2022 52353 30-04-2022
1 14-06-2021 8.9 4475 14-01-2022 2546 05-02-2022 5757 28-03-2022 2352 01-04-2022我想找到一个包含特定字符串的列表,比如Jan-22Total、Jan-22、Feb-22Total、Feb-22、Mar-22Total、Mar-22等等。基本上是%b-%y格式。
我试过几个密码,但还是没有线索。名单还没出来。
这是我迄今为止尝试过的,但是结果只显示了[]。
total_col = [col for col in ds.columns if '%b-%y' in col]
print(list(ds.columns))
print(total_col)我该如何列出列名?
发布于 2022-03-17 03:00:48
简单方法
如果您不需要确保有效日期,则可以使用简短的正则表达式,这是一种粗糙但可能足够的方法:
m = ds.columns.str.match(r'\w+-\d+')
cols = ds.columns[m]输出:['Jan-22Total', 'Jan-22', 'Feb-22Total', 'Feb-22', 'Mar-22Total', 'Mar-22', 'Apr-22Total', 'Apr-22']
r'[A-Z][a-z]{2}-\d+' (3个字母大写的月份缩写)是一个稍具判断力的正则表达式。
鲁棒方法
一个更健壮的方法是使用pandas.to_datetime验证日期。
m = (pd.to_datetime(ds.columns.str.extract(r'^(\w+-\d+)',
expand=False), format='%b-%y', errors='coerce')
.notna()
)
cols = ds.columns[m]https://stackoverflow.com/questions/71506512
复制相似问题