Python 这些列以数字结尾

Python 这些列以数字结尾,python,pandas,Python,Pandas,我有一个具有以下列名的df: 名称,xyz,ijk,1,2,3,val1,val2,test1,test2 我想删除所有以数字结尾的列,但我仍然想保留只有数字的列。如何做到这一点 结果将是:Name、xyz、ijk、1、2、3 谢谢 以下是实现这一目标的一种方法: df = pd.DataFrame( { 'xyz': [1, 2, 3], 'ijk': [1, 2, 3], 1: [1, 2, 3], 'val1': [1

我有一个具有以下列名的df:

名称,xyz,ijk,1,2,3,val1,val2,test1,test2 我想删除所有以数字结尾的列,但我仍然想保留只有数字的列。如何做到这一点

结果将是:Name、xyz、ijk、1、2、3


谢谢

以下是实现这一目标的一种方法:

df = pd.DataFrame(
    {
        'xyz': [1, 2, 3],
        'ijk': [1, 2, 3],
        1: [1, 2, 3],
        'val1': [1, 2, 3],
        'test1': [1, 2, 3]
    }
)

df.loc[:, ~((df.columns.astype(str).str.contains('\d$')) & (df.columns.astype(str).str.len() > 1))]
#   1  ijk  xyz
#0  1    1    1
#1  2    2    2
#2  3    3    3
注释中的代码产生了错误,因为两个布尔序列周围缺少括号。你可以把它写成:

df.columns[(~df.columns.astype(str).str.match("(.*\d.*)")) & (df.columns.astype(str).str.len() > 1)]
#Index([u'ijk', u'xyz'], dtype='object')
但这实际上会给你错误的答案。相反,您的逻辑可以稍微修改为:

df.columns[~((df.columns.astype(str).str.match("(.*\d)")) & (df.columns.astype(str).str.len() > 1))] 
#Index([1, u'ijk', u'xyz'], dtype='object')
设置-

df = pd.DataFrame(columns=['xyz', 'ijk', '1', '2', '3', 'val1', 'test1', 'test2'])
df

Empty DataFrame
Columns: [xyz, ijk, 1, 2, 3, val1, test1, test2]
Index: []
这里的基本假设是所有列名都是字符串。让我们为此使用
过滤器

df.filter(regex='^(?:.+\D|\d+)$')

Empty DataFrame
Columns: [xyz, ijk, 1, 2, 3]
Index: []
详细信息
filter
用于传递正则表达式。这里的模式是-

^      # SOL
(?:    # non-capture group
.+\D   # anything that does not end in a digit
|      # regex OR pipe
\d+    # *only* digits
) 
$      # EOL

如果不是所有列名都是字符串,那么在转换它们之前,这不是一个可行的解决方案-

df.columns = df.columns.astype(str)

过滤器
现在将像以前一样工作。

有研究吗?你试过什么?你被卡在哪里了?你应该能够很容易地从你的答案中找出如何做到这一点。@pault我想我可以做df=df[df.columns[~(df.columns.str.startswith('\d')),但这将删除1 2 3..,而且你非常接近。我将给你一些提示:你想要的是
startswith()
也许检查长度会有帮助。@pault我尝试了df.columns[~df.columns.astype(str.str.match((.*\d.*))&df.columns.astype(str.str.len()>1],但我遇到了一个错误,错误是“TypeError:numpy.ndarray”和“Int64Index”的操作数类型不受支持”。我还尝试了endswith函数,我曾考虑在我的帖子中添加,您或温(以及其他人)可能会出现,并给出一个更优雅的解决方案。这就是为什么我写了“这里有一个方法…”的原因。@pault嘿,你会及时到达的:)这也是对你的努力的一个加分。感谢大家的帮助!正则表达式的详细信息非常有用。我一直在寻找这些模式,以便更轻松地实现我的代码。@TylerNG这就是我来这里的目的。;-)