У меня есть следующий фрейм данных:
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))]
Есть ли другой способ добиться того же самого, не упоминая каждый столбец (возможно, в зависимости от диапазона позиций столбцов)?
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
Ты можешь это сделать:
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
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.