Python 这些列以数字结尾
我有一个具有以下列名的df: 名称,xyz,ijk,1,2,3,val1,val2,test1,test2 我想删除所有以数字结尾的列,但我仍然想保留只有数字的列。如何做到这一点 结果将是:Name、xyz、ijk、1、2、3Python 这些列以数字结尾,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 = 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这就是我来这里的目的。;-)