У меня есть DataFrame:
import pandas as pd
import numpy as np
df = pd.DataFrame({'foo.aa': [1, 2.1, np.nan, 4.7, 5.6, 6.8],
'foo.fighters': [0, 1, np.nan, 0, 0, 0],
'foo.bars': [0, 0, 0, 0, 0, 1],
'bar.baz': [5, 5, 6, 5, 5.6, 6.8],
'foo.fox': [2, 4, 1, 0, 0, 5],
'nas.foo': ['NA', 0, 1, 0, 0, 0],
'foo.manchu': ['NA', 0, 0, 0, 0, 0],})
Я хочу выбрать значения 1 в столбцах, начиная с foo.
. Есть ли лучший способ сделать это, кроме:
df2 = df[(df['foo.aa'] == 1)|
(df['foo.fighters'] == 1)|
(df['foo.bars'] == 1)|
(df['foo.fox'] == 1)|
(df['foo.manchu'] == 1)
]
Что-то вроде написания чего-то вроде:
df2= df[df.STARTS_WITH_FOO == 1]
Ответ должен распечатать DataFrame следующим образом:
bar.baz foo.aa foo.bars foo.fighters foo.fox foo.manchu nas.foo
0 5.0 1.0 0 0 2 NA NA
1 5.0 2.1 0 1 4 0 0
2 6.0 NaN 0 NaN 1 0 1
5 6.8 6.8 1 0 5 0 0
[4 rows x 7 columns]
Самый простой способ - использовать str непосредственно в именах столбцов, нет необходимости в
pd.Series
источник
Основываясь на ответе @ EdChum, вы можете попробовать следующее решение:
Это будет действительно полезно, если не все столбцы, которые вы хотите выбрать, начинаются с
foo
. Этот метод выбирает все столбцы, содержащие подстроку,foo
и ее можно поместить в любую точку имени столбца.По сути, я заменил
.startswith()
на.contains()
.источник
Мое решение. Это может быть медленнее по производительности:
источник
Другой вариант выбора нужных записей - использовать
map
:который дает вам все столбцы для строк, содержащих
1
:Выбор строки выполняется
как в ответе @ ajcr, который дает вам:
это означает , что ряд
3
и4
не содержат1
и не будет выбран.Выбор столбцов осуществляется с помощью булевой индексации , как это:
В приведенном выше примере это возвращает
Таким образом, если столбец не начинается с
foo
,False
возвращается, и поэтому столбец не выбран.Если вы просто хотите вернуть все строки, содержащие a
1
- как предполагает ваш желаемый результат - вы можете просто сделатькоторый возвращается
источник
Вы можете попробовать регулярное выражение здесь, чтобы отфильтровать столбцы, начинающиеся с "foo"
df.filter(regex='^foo*')
Если вам нужно, чтобы в столбце была строка foo, тогда
df.filter(regex='foo*')
было бы уместно.
Для следующего шага вы можете использовать
df[df.filter(regex='^foo*').values==1]
чтобы отфильтровать строки, в которых одно из значений столбца 'foo *' равно 1.
источник
В моем случае мне понадобился список префиксов
источник