仅选择包含特定字符串的列名称

时间:2015-04-18 15:13:18

标签: python pandas

一个简单的例子应该让这个显而易见。样本数据:

df = pd.DataFrame( np.random.randn(2,6), columns=['x','y','xy','yx','xx','yy'] )

现在,我只想列出包含' x'的列的值。这有以下两种方式:

df[[ x for x in df.columns if 'x' in x ]]
Out[53]: 
          x        xy        yx        xx
0  2.089078  1.111139 -0.218800  1.025810
1 -0.343189  0.274676 -0.342798 -0.503809

df[ df.columns[pd.Series(df.columns).str.contains('x')] ]
Out[54]: 
          x        xy        yx        xx
0  2.089078  1.111139 -0.218800  1.025810
1 -0.343189  0.274676 -0.342798 -0.503809

后一种方法似乎很有希望,但它真的很丑陋,到目前为止还没有找到缩短它的方法。更像这样的东西会很棒:

df[ columns_with( df, 'x' ) ] 

事实上我用一个函数做了类似的事情,但是我想知道如果没有用户编写的函数或monkeypatch,是否有一种pandastic方法可以做到这一点?

对于动机/背景,如果您有一个包含大量列的不熟悉的数据集,或者即使您拥有熟悉的数据集但却无法记住数百个变量的确切名称,那么此类内容非常有用。对于我需要此功能的情况,我经常会在数据探索阶段一遍又一遍地这样做,所以我有一个快速而简单的方法来实现这一点非常值得。< / p>

2 个答案:

答案 0 :(得分:8)

您可以将DataFrame.filterlike参数一起使用:

>>> df.filter(like="x")
          x        xy        yx        xx
0 -1.467867  0.766077  1.210667  1.116529
1 -0.041965  0.546325 -0.590660  1.037151

like参数表示“将信息轴保持在arg in col == True”。

答案 1 :(得分:0)

@DSM的答案完全解决了这个问题,但是regex组合提供了一种与like相比可比的更通用的方法。例如,要复制like的功能:

df.filter(regex='x')

但是您还可以做更多的事情,例如:

df.filter(regex='^x')       # x must be the first character
df.filter(regex='X|x')      # includes upper and lower case