大熊猫掉落的专栏以数字结尾

时间:2018-01-30 01:05:40

标签: python pandas

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

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

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

谢谢!

2 个答案:

答案 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现在将像以前一样工作。