У меня есть следующий фрейм данных:

    name  c1 c2 c3 c4 c5 c6 c7 c8 
    ---   -- -- -- -- -- -- -- --
0   img1  0  1  1  0  0  0  1  0
1   img2  1  0  0  0  0  0  1  1
2   img3  1  0  0  1  0  1  0  0
...

Я хотел бы выбрать те строки, которые имеют по крайней мере одно ненулевое значение (т.е. 1) в диапазоне столбцов от c2 до c6. Результирующий кадр данных должен исключать вторую строку (img2 ...).

Я могу решить эту проблему, упомянув каждый столбец отдельно в условии:

df = df[((df['c2']==1) | (df['c3']==1) ... | (df['c6']==1))]

Есть ли другой способ добиться того же самого, не упоминая каждый столбец (возможно, в зависимости от диапазона позиций столбцов)?

1
SaadH 21 Дек 2019 в 04:36

2 ответа

Лучший ответ
# test data
from io import StringIO
data = StringIO('''name,c1,c2,c3,c4,c5,c6,c7,c8
img1,0,1,1,0,0,0,1,0
img2,1,0,0,0,0,0,1,1
img3,1,0,0,1,0,1,0,0''')

import pandas as pd
df = pd.read_csv(data)


# list of columns to be used

# select using column name
# cols = ['c{}'.format(i) for i in range(2,7)]

# select using column number
cols = df.columns[2:7]

# select if any col is 1
df = df[(df[cols]==1).any(axis=1)]



print(df)

   name  c1  c2  c3  c4  c5  c6  c7  c8
0  img1   0   1   1   0   0   0   1   0
2  img3   1   0   0   1   0   1   0   0
2
9mat 21 Дек 2019 в 02:11

Ты можешь сделать это:

df[df.ix[:,2:7].eq(1).any(axis=1)].ix[:,2:7] 

Вывод (отсутствует строка 1 из-за всех нулей):

   c2  c3  c4  c5  c6
0   1   1   0   0   0
2   0   0   1   0   1

Чтобы показать все столбцы:

df[df.ix[:,2:7].eq(1).any(axis=1)] 

Выход:

   name  c1  c2  c3  c4  c5  c6  c7  c8
0  img1   0   1   1   0   0   0   1   0
2  img3   1   0   0   1   0   1   0   0
1
oppressionslayer 21 Дек 2019 в 02:22