根据列内的字符串删除列范围

时间:2017-07-27 16:09:12

标签: python python-3.x pandas

大家好,所以我试图删除一系列列,因为第一列有单词' Sea'

1 |  2  | 3 | 4 | 5
10  'sea'         48
15   11   23  25  26
28   26   14  9   21

In [14]: df.columns
Out [14]: Index([0,1,2,3,4,5,6,7],dtype = 'object')

我想要实现的输出:

1 |  5
10  48
15  26
28  21

我到目前为止的代码,因为我的列标题是整数:

for c in df.columns:
    if df[c].str.contains(pat = 'Sea'):
        df.drop(df.columns[[range(c,c+2)]],axis=1,inplace=True)

然而,这会返回模糊真值的错误。任何帮助表示赞赏

3 个答案:

答案 0 :(得分:0)

将第二行更改为:

if any(df[c].str.contains(pat = 'Sea')):

df.str.contains返回一个布尔值列表,指示每行的条件是真还是假。这是模糊真值的错误的起源。通过使用any()函数,您可以将列表转换为一个布尔值。

更新

当您找到“sea”时,您同时删除3列,然后循环要继续删除列,因此键错误。试试这个作为第3行:

df.drop(df.columns[c],axis=1,inplace=True)

答案 1 :(得分:0)

我会使用np.where来确定违规列的位置

i = np.where((df.values == 'sea').any(0))[0]
cat = np.concatenate([range(c, c + 3) for c in df.columns[i]])
df.drop(np.unique(cat), 1)

    1   5
0  10  48
1  15  26
2  28  21

答案 2 :(得分:0)

for num in range(len(df)):
    for i in range(len(df.columns)-6): #for countries and id 
        if pd.Series.any(sh1[num].iloc[:,i].str.contains(pat="Sea")):
            df.drop([df].columns[i],df.columns[i+1],
            df.columns[i+2]],axis=1,inplace=True)

对我有用。随意清理代码/建议有效的方法