我有一个带有以下列名的df:
名称,xyz,ijk,1,2,3,val1,val2,test1,test2 我想删除名称以数字结尾的所有列,但我仍然希望保留只有数字的列。如何才能做到这一点?
结果将是:Name,xyz,ijk,1,2,3
谢谢!
答案 0 :(得分:2)
以下是实现此目的的一种方法:
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')
答案 1 :(得分:2)
设置 -
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: []
这里的基本假设是所有你的列名是 strings 。让我们使用filter
。
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)
filter
现在将像以前一样工作。