Обратите внимание на круглые скобки. Благодаря Питон правила приоритета операций , &связывает более плотно , чем <=и >=. Таким образом, скобки в последнем примере необходимы. Без скобок
Чтобы выбрать строки, чье значение столбца не равноsome_value , используйте !=:
df.loc[df['column_name']!= some_value]
isinвозвращает логическое значение серии, поэтому , чтобы выбрать строки , в которых значение не в some_values, свести на нет булева Series с помощью ~:
df.loc[~df['column_name'].isin(some_values)]
Например,
import pandas as pdimport numpy as np
df = pd.DataFrame({'A':'foo bar foo bar foo bar foo foo'.split(),'B':'one one two three two two one three'.split(),'C': np.arange(8),'D': np.arange(8)*2})print(df)# A B C D# 0 foo one 0 0# 1 bar one 1 2# 2 foo two 2 4# 3 bar three 3 6# 4 foo two 4 8# 5 bar two 5 10# 6 foo one 6 12# 7 foo three 7 14print(df.loc[df['A']=='foo'])
доходность
A B C D0 foo one 002 foo two 244 foo two 486 foo one 6127 foo three 714
Если у вас есть несколько значений, которые вы хотите включить, поместите их в список (или, в более общем случае, любой итеративный) и используйте isin:
print(df.loc[df['B'].isin(['one','three'])])
доходность
A B C D0 foo one 001 bar one 123 bar three 366 foo one 6127 foo three 714
Обратите внимание, однако, что если вы хотите сделать это много раз, более эффективно сначала создать индекс, а затем использовать df.loc:
df = df.set_index(['B'])print(df.loc['one'])
доходность
A C D
B
one foo 00
one bar 12
one foo 612
или, чтобы включить несколько значений из индекса использования df.index.isin:
df.loc[df.index.isin(['one','two'])]
доходность
A C D
B
one foo 00
one bar 12
two foo 24
two foo 48
two bar 510
one foo 612
Фактически, df [df ['colume_name'] == some_value] также работает. Но моя первая попытка, df.where (df ['colume_name'] == some_value) не работает ... не знаю почему ...
szli
13
Когда вы используете df.where(condition), условие должно иметь ту же форму, что и df.
К вашему сведению: если вы хотите выбрать строку на основе двух (или более) меток (требующих либо обе, либо одну), см. Stackoverflow.com/questions/31756340/…
Шейн
7
Так как df[df['column_name'] == some_value]работает, зачем нам .locсюда добавлять ?
qqqwww
314
Есть несколько способов выбора строк во фрейме данных Pandas:
Булева индексация ( df[df['col'] == value])
Позиционная индексация ( df.iloc[...])
Индексирование меток ( df.xs(...))
df.query(...) API
Ниже я покажу вам примеры каждого из них, с советами, когда использовать определенные методы. Предположим, наш критерий - столбец 'A'=='foo'
(Примечание по производительности: для каждого базового типа мы можем упростить задачу, используя API pandas, или мы можем выйти за пределы API, как правило numpy, и ускорить процесс.)
Настройка
Первое, что нам нужно, это определить условие, которое будет служить нашим критерием для выбора строк. Мы начнем со случая OP column_name == some_valueи включим некоторые другие общие случаи использования.
Заимствование из @unutbu:
import pandas as pd, numpy as np
df = pd.DataFrame({'A':'foo bar foo bar foo bar foo foo'.split(),'B':'one one two three two two one three'.split(),'C': np.arange(8),'D': np.arange(8)*2})
1. Булева индексация
... Для логического индексирования необходимо найти истинное значение 'A'столбца каждой строки, равное 'foo', а затем использовать эти значения истинности, чтобы определить, какие строки следует сохранить. Обычно мы называем эту серию массивом значений истинности mask. Мы сделаем это и здесь.
mask = df['A']=='foo'
Затем мы можем использовать эту маску для нарезки или индексации фрейма данных.
df[mask]
A B C D0 foo one 002 foo two 244 foo two 486 foo one 6127 foo three 714
Это один из самых простых способов выполнить эту задачу, и если производительность или интуитивность не является проблемой, это должен быть выбранный вами метод. Однако, если производительность является проблемой, то вы можете рассмотреть альтернативный способ создания mask.
2. Позиционная индексация
Позиционная индексация ( df.iloc[...]) имеет свои варианты использования, но это не один из них. Чтобы определить, где нарезать, нам сначала нужно выполнить тот же логический анализ, который мы сделали выше. Это оставляет нам выполнение одного дополнительного шага, чтобы выполнить ту же задачу.
mask = df['A']=='foo'
pos = np.flatnonzero(mask)
df.iloc[pos]
A B C D0 foo one 002 foo two 244 foo two 486 foo one 6127 foo three 714
3. Ярлык индексирования
Индексирование меток может быть очень удобным, но в этом случае мы снова делаем больше работы без пользы
df.set_index('A', append=True, drop=False).xs('foo', level=1)
A B C D0 foo one 002 foo two 244 foo two 486 foo one 6127 foo three 714
4. df.query()API
pd.DataFrame.queryэто очень элегантный / интуитивно понятный способ выполнить эту задачу, но часто медленнее. Однако , если вы обратите внимание на временные параметры ниже, для больших данных запрос будет очень эффективным. Больше, чем стандартный подход и такой же величины, как мое лучшее предложение.
df.query('A == "foo"')
A B C D0 foo one 002 foo two 244 foo two 486 foo one 6127 foo three 714
Я предпочитаю использовать Booleanmask
Фактические улучшения могут быть сделаны путем изменения того, как мы создаем наши Booleanmask.
maskАльтернатива 1 Использовать базовый numpyмассив и отказаться от накладных расходов на создание другогоpd.Series
mask = df['A'].values =='foo'
В конце я покажу более полные временные тесты, но просто взглянем на прирост производительности, который мы получаем, используя образец фрейма данных. Во-первых, мы смотрим на разницу в созданииmask
%timeit mask = df['A'].values =='foo'%timeit mask = df['A']=='foo'5.84µs ±195 ns per loop (mean ± std. dev. of 7 runs,100000 loops each)166µs ±4.45µs per loop (mean ± std. dev. of 7 runs,10000 loops each)
Оценка maskс помощью numpyмассива происходит в ~ 30 раз быстрее. Отчасти это связано с тем, что numpyоценка часто происходит быстрее. Это также отчасти связано с отсутствием накладных расходов, необходимых для построения индекса и соответствующего pd.Seriesобъекта.
Далее мы посмотрим на время нарезки одного maskна другое.
mask = df['A'].values =='foo'%timeit df[mask]
mask = df['A']=='foo'%timeit df[mask]219µs ±12.3µs per loop (mean ± std. dev. of 7 runs,1000 loops each)239µs ±7.03µs per loop (mean ± std. dev. of 7 runs,1000 loops each)
Прирост производительности не так выражен. Посмотрим, выдержит ли это более надежное тестирование.
maskВариант 2
Мы могли бы также восстановить фрейм данных. Существует большое предостережение при реконструкции кадра данных - вы должны позаботиться об dtypesэтом!
Если фрейм данных имеет смешанный тип, как в нашем примере, то когда мы получим df.valuesрезультирующий массив, dtypeobjectи, следовательно, все столбцы нового фрейма данных будут иметь dtypeobject. Таким образом, требуя astype(df.dtypes)и убивая любые потенциальные выгоды производительности.
%timeit df[m]%timeit pd.DataFrame(df.values[mask], df.index[mask], df.columns).astype(df.dtypes)216µs ±10.4µs per loop (mean ± std. dev. of 7 runs,1000 loops each)1.43 ms ±39.6µs per loop (mean ± std. dev. of 7 runs,1000 loops each)
Однако, если фрейм данных не имеет смешанного типа, это очень полезный способ сделать это.
Данный
np.random.seed([3,1415])
d1 = pd.DataFrame(np.random.randint(10, size=(10,5)), columns=list('ABCDE'))
d1
A B C D E002738170686202049373243436774553759687647762665828758947615
%%timeit
mask = d1['A'].values ==7
d1[mask]179µs ±8.73µs per loop (mean ± std. dev. of 7 runs,10000 loops each)
Против
%%timeit
mask = d1['A'].values ==7
pd.DataFrame(d1.values[mask], d1.index[mask], d1.columns)87µs ±5.12µs per loop (mean ± std. dev. of 7 runs,10000 loops each)
Мы сократили время пополам.
maskАльтернатива 3
@unutbu также показывает нам, как использовать pd.Series.isinдля учета каждого элемента df['A']нахождения в наборе значений. Это оценивает то же самое, если наш набор значений является набором одного значения, а именно 'foo'. Но это также обобщает включение больших наборов значений, если это необходимо. Оказывается, это все еще довольно быстро, хотя это более общее решение. Единственная реальная потеря заключается в интуитивности для тех, кто не знаком с концепцией.
mask = df['A'].isin(['foo'])
df[mask]
A B C D0 foo one 002 foo two 244 foo two 486 foo one 6127 foo three 714
Однако, как и прежде, мы можем использовать его numpyдля повышения производительности, практически ничего не жертвуя. Мы будем использоватьnp.in1d
mask = np.in1d(df['A'].values,['foo'])
df[mask]
A B C D0 foo one 002 foo two 244 foo two 486 foo one 6127 foo three 714
Сроки
Я включу другие концепции, упомянутые в других сообщениях, а также для справки. Код ниже
Каждый столбец в этой таблице представляет фрейм данных различной длины, в котором мы тестируем каждую функцию. Каждый столбец показывает относительное время, с самой быстрой функцией, имеющей базовый индекс 1.0.
for j in spec.columns:
d = pd.concat([df]* j, ignore_index=True)for i in spec.index:
stmt ='{}(d)'.format(i)
setp ='from __main__ import d, {}'.format(i)
spec.at[i, j]= timeit(stmt, setp, number=50)
Фантастический ответ! 2 вопроса, хотя, я) как бы .iloc(numpy.where(..))сравнить в этой схеме? II) вы ожидаете, что рейтинги будут одинаковыми при использовании нескольких условий?
Посеф
3
Для выполнения pd.Series.isin, обратите внимание , что делает использование np.in1dпод капотом в конкретном сценарии использования Хаш в других, и неявно применяется компромисс между стоимостью хеширования по сравнению с производительностью в конкретных ситуациях. Этот ответ более подробно.
jpp
1
На 9 экранах это перегрузка для нового или даже промежуточного пользователя. Вы можете и должны суммировать слова в первом абзаце.
smci
@piRSquared Scaling вопросы вы не возражаете, @piRSquared, также разместить свой опыт о том , как хорошо фактические[{P|EXP}TIME] - и [{C|P|EXP}SPACE]- затраты использования выше предложенных форм блок-синтаксиса (обработка сверху вниз всего dataframes сразу) растут , а именно , когда масштабируется до некоторого количества ~1E6, ~1E9, ~1E12строк? Спасибо, что показали нам всю картину, сэр. [min, Avg, MAX, StDev]Всегда приветствуются количественные значения эталонных тестов , так как minи MAXзначения, и значения сопровождают Mean/StDevрельеф партии.
import pandas as pd
# Create data set
d ={'foo':[100,111,222],'bar':[333,444,555]}
df = pd.DataFrame(d)# Full dataframe:
df
# Shows:# bar foo # 0 333 100# 1 444 111# 2 555 222# Output only the row(s) in df where foo is 222:
df[df.foo ==222]# Shows:# bar foo# 2 555 222
В приведенном выше коде это строка, df[df.foo == 222]которая дает строки на основе значения столбца, 222в данном случае.
queryэто единственный ответ, который совместим с цепочкой методов. Кажется, это аналог панд filterв dplyr.
Берк У.
3
Привет, в вашем третьем примере (несколько столбцов) я думаю, что вам нужны квадратные скобки, а [не круглые скобки (снаружи.
user2739472
2
сначала я думал, что |это для AND, но, конечно, это оператор OR ...
O-9
для нескольких условий, используя AND, можно сделатьdf[condition1][condition2]
Ritwik
1
Оставьте это здесь на всякий случай, если это кому-нибудь пригодится: запрос от 0.25 можно использовать с именами столбцов, в имени которых есть пробелы, заключив имя в обратные df.query('`my col` == 124')
черты
65
Я нахожу синтаксис предыдущих ответов излишним и трудным для запоминания. Панда представил query()метод в v0.13, и я предпочитаю его. По вашему вопросу вы могли бы сделатьdf.query('col == val')
In[167]: n =10In[168]: df = pd.DataFrame(np.random.rand(n,3), columns=list('abc'))In[169]: df
Out[169]:
a b c
00.6877040.5823140.28164510.2508460.6100210.42012120.6243280.4018160.93214630.0117630.0229210.24418640.5901980.3256800.89039250.5988920.2964240.00731260.6346250.8030690.12387270.9241680.3250760.30374680.1168220.3645640.45460790.9861420.7519530.561512# pure pythonIn[170]: df[(df.a < df.b)&(df.b < df.c)]Out[170]:
a b c
30.0117630.0229210.24418680.1168220.3645640.454607# queryIn[171]: df.query('(a < b) & (b < c)')Out[171]:
a b c
30.0117630.0229210.24418680.1168220.3645640.454607
Вы также можете получить доступ к переменным в среде, добавив @.
exclude =('red','orange')
df.query('color not in @exclude')
В моем случае мне нужна была цитата, потому что val - это строка. df.query ('col == "val"')
smerlung
28
Больше гибкости при использовании .queryс pandas >= 0.25.0:
Август 2019 обновленный ответ
Поскольку pandas >= 0.25.0мы можем использовать этот queryметод для фильтрации кадров данных с помощью методов pandas и даже имен столбцов, в которых есть пробелы. Обычно пробелы в именах столбцов приводят к ошибке, но теперь мы можем решить эту проблему с помощью обратного символа (`), см. GitHub :
In[76]: df.iloc[np.where(df.A.values=='foo')]Out[76]:
A B C D
0 foo one 002 foo two 244 foo two 486 foo one 6127 foo three 714
Сроки сравнения:
In[68]:%timeit df.iloc[np.where(df.A.values=='foo')]# fastest1000 loops, best of 3:380µs per loop
In[69]:%timeit df.loc[df['A']=='foo']1000 loops, best of 3:745µs per loop
In[71]:%timeit df.loc[df['A'].isin(['foo'])]1000 loops, best of 3:562µs per loop
In[72]:%timeit df[df.A=='foo']1000 loops, best of 3:796µs per loop
In[74]:%timeit df.query('(A=="foo")')# slowest1000 loops, best of 3:1.71 ms per loop
from pandas importDataFrame# Create data set
d ={'Revenue':[100,111,222],'Cost':[333,444,555]}
df =DataFrame(d)# mask = Return True when the value in column "Revenue" is equal to 111
mask = df['Revenue']==111print mask
# Result:# 0 False# 1 True# 2 False# Name: Revenue, dtype: bool# Select * FROM df WHERE Revenue = 111
df[mask]# Result:# Cost Revenue# 1 444 111
Чтобы добавить к этому известному вопросу (хотя и слишком поздно): Вы также df.groupby('column_name').get_group('column_desired_value').reset_index()можете создать новый фрейм данных с указанным столбцом, имеющим определенное значение. Например
import pandas as pd
df = pd.DataFrame({'A':'foo bar foo bar foo bar foo foo'.split(),'B':'one one two three two two one three'.split()})print("Original dataframe:")print(df)
b_is_two_dataframe = pd.DataFrame(df.groupby('B').get_group('two').reset_index()).drop('index', axis =1)#NOTE: the final drop is to remove the extra index column returned by groupby objectprint('Sub dataframe where B is two:')print(b_is_two_dataframe)
Выполнить это дает:
Original dataframe:
A B
0 foo one
1 bar one
2 foo two
3 bar three
4 foo two
5 bar two
6 foo one
7 foo three
Sub dataframe where B is two:
A B
0 foo two
1 foo two
2 bar two
Отличный ответ. Просто хотел бы добавить, что второй (pd.DataFrame) является избыточным, потому get_group()что автоматически вернет фрейм данных. Также вы можете просто сказать «drop = True» в качестве параметра reset_index(). Другими словами, это может быть сокращено до: b_is_two_dataframe = df.groupby('B').get_group('two').reset_index(drop=True)
Ответы:
Чтобы выбрать строки, значение столбца которых равно скаляру
some_value
, используйте==
:Чтобы выбрать строки, чье значение столбца является итеративным
some_values
, используйтеisin
:Объедините несколько условий с
&
:Обратите внимание на круглые скобки. Благодаря Питон правила приоритета операций ,
&
связывает более плотно , чем<=
и>=
. Таким образом, скобки в последнем примере необходимы. Без скобоканализируется как
что приводит к значению Истины Серии, является неоднозначной ошибкой .
Чтобы выбрать строки, чье значение столбца не равно
some_value
, используйте!=
:isin
возвращает логическое значение серии, поэтому , чтобы выбрать строки , в которых значение не вsome_values
, свести на нет булева Series с помощью~
:Например,
доходность
Если у вас есть несколько значений, которые вы хотите включить, поместите их в список (или, в более общем случае, любой итеративный) и используйте
isin
:доходность
Обратите внимание, однако, что если вы хотите сделать это много раз, более эффективно сначала создать индекс, а затем использовать
df.loc
:доходность
или, чтобы включить несколько значений из индекса использования
df.index.isin
:доходность
источник
df.where(condition)
, условие должно иметь ту же форму, что иdf
.df[df['column_name'] == some_value]
работает, зачем нам.loc
сюда добавлять ?Есть несколько способов выбора строк во фрейме данных Pandas:
df[df['col'] == value
])df.iloc[...]
)df.xs(...)
)df.query(...)
APIНиже я покажу вам примеры каждого из них, с советами, когда использовать определенные методы. Предположим, наш критерий - столбец
'A'
=='foo'
(Примечание по производительности: для каждого базового типа мы можем упростить задачу, используя API pandas, или мы можем выйти за пределы API, как правило
numpy
, и ускорить процесс.)Настройка
Первое, что нам нужно, это определить условие, которое будет служить нашим критерием для выбора строк. Мы начнем со случая OP
column_name == some_value
и включим некоторые другие общие случаи использования.Заимствование из @unutbu:
1. Булева индексация
... Для логического индексирования необходимо найти истинное значение
'A'
столбца каждой строки, равное'foo'
, а затем использовать эти значения истинности, чтобы определить, какие строки следует сохранить. Обычно мы называем эту серию массивом значений истинностиmask
. Мы сделаем это и здесь.Затем мы можем использовать эту маску для нарезки или индексации фрейма данных.
Это один из самых простых способов выполнить эту задачу, и если производительность или интуитивность не является проблемой, это должен быть выбранный вами метод. Однако, если производительность является проблемой, то вы можете рассмотреть альтернативный способ создания
mask
.2. Позиционная индексация
Позиционная индексация (
df.iloc[...]
) имеет свои варианты использования, но это не один из них. Чтобы определить, где нарезать, нам сначала нужно выполнить тот же логический анализ, который мы сделали выше. Это оставляет нам выполнение одного дополнительного шага, чтобы выполнить ту же задачу.3. Ярлык индексирования
Индексирование меток может быть очень удобным, но в этом случае мы снова делаем больше работы без пользы
4.
df.query()
APIpd.DataFrame.query
это очень элегантный / интуитивно понятный способ выполнить эту задачу, но часто медленнее. Однако , если вы обратите внимание на временные параметры ниже, для больших данных запрос будет очень эффективным. Больше, чем стандартный подход и такой же величины, как мое лучшее предложение.Я предпочитаю использовать
Boolean
mask
Фактические улучшения могут быть сделаны путем изменения того, как мы создаем наши
Boolean
mask
.mask
Альтернатива 1Использовать базовый
numpy
массив и отказаться от накладных расходов на создание другогоpd.Series
В конце я покажу более полные временные тесты, но просто взглянем на прирост производительности, который мы получаем, используя образец фрейма данных. Во-первых, мы смотрим на разницу в создании
mask
Оценка
mask
с помощьюnumpy
массива происходит в ~ 30 раз быстрее. Отчасти это связано с тем, чтоnumpy
оценка часто происходит быстрее. Это также отчасти связано с отсутствием накладных расходов, необходимых для построения индекса и соответствующегоpd.Series
объекта.Далее мы посмотрим на время нарезки одного
mask
на другое.Прирост производительности не так выражен. Посмотрим, выдержит ли это более надежное тестирование.
mask
Вариант 2Мы могли бы также восстановить фрейм данных. Существует большое предостережение при реконструкции кадра данных - вы должны позаботиться об
dtypes
этом!Вместо этого
df[mask]
мы сделаем этоЕсли фрейм данных имеет смешанный тип, как в нашем примере, то когда мы получим
df.values
результирующий массив,dtype
object
и, следовательно, все столбцы нового фрейма данных будут иметьdtype
object
. Таким образом, требуяastype(df.dtypes)
и убивая любые потенциальные выгоды производительности.Однако, если фрейм данных не имеет смешанного типа, это очень полезный способ сделать это.
Данный
Против
Мы сократили время пополам.
mask
Альтернатива 3@unutbu также показывает нам, как использовать
pd.Series.isin
для учета каждого элементаdf['A']
нахождения в наборе значений. Это оценивает то же самое, если наш набор значений является набором одного значения, а именно'foo'
. Но это также обобщает включение больших наборов значений, если это необходимо. Оказывается, это все еще довольно быстро, хотя это более общее решение. Единственная реальная потеря заключается в интуитивности для тех, кто не знаком с концепцией.Однако, как и прежде, мы можем использовать его
numpy
для повышения производительности, практически ничего не жертвуя. Мы будем использоватьnp.in1d
Сроки
Я включу другие концепции, упомянутые в других сообщениях, а также для справки.
Код ниже
Каждый столбец в этой таблице представляет фрейм данных различной длины, в котором мы тестируем каждую функцию. Каждый столбец показывает относительное время, с самой быстрой функцией, имеющей базовый индекс
1.0
.Вы заметите , что кратчайшее время , как представляется, распределяются между
mask_with_values
иmask_with_in1d
функции
тестирование
Особое время
Рассмотрим особый случай, когда у нас есть один необъект
dtype
для всего фрейма данных. Код нижеОказывается, реконструкция не стоит нескольких сотен рядов.
функции
тестирование
источник
.iloc(numpy.where(..))
сравнить в этой схеме? II) вы ожидаете, что рейтинги будут одинаковыми при использовании нескольких условий?pd.Series.isin
, обратите внимание , что делает использованиеnp.in1d
под капотом в конкретном сценарии использования Хаш в других, и неявно применяется компромисс между стоимостью хеширования по сравнению с производительностью в конкретных ситуациях. Этот ответ более подробно.[{P|EXP}TIME]
- и[{C|P|EXP}SPACE]
- затраты использования выше предложенных форм блок-синтаксиса (обработка сверху вниз всего dataframes сразу) растут , а именно , когда масштабируется до некоторого количества~1E6, ~1E9, ~1E12
строк? Спасибо, что показали нам всю картину, сэр.[min, Avg, MAX, StDev]
Всегда приветствуются количественные значения эталонных тестов , так какmin
иMAX
значения, и значения сопровождаютMean/StDev
рельеф партии.ТЛ; др
Панды, эквивалентные
является
Несколько условий:
или
Пример кода
В приведенном выше коде это строка,
df[df.foo == 222]
которая дает строки на основе значения столбца,222
в данном случае.Возможны также несколько условий:
Но в этот момент я бы порекомендовал использовать функцию запроса , так как она менее многословна и дает тот же результат:
источник
query
это единственный ответ, который совместим с цепочкой методов. Кажется, это аналог пандfilter
в dplyr.[
не круглые скобки(
снаружи.|
это для AND, но, конечно, это оператор OR ...df[condition1][condition2]
df.query('`my col` == 124')
Я нахожу синтаксис предыдущих ответов излишним и трудным для запоминания. Панда представил
query()
метод в v0.13, и я предпочитаю его. По вашему вопросу вы могли бы сделатьdf.query('col == val')
Воспроизводится с http://pandas.pydata.org/pandas-docs/version/0.17.0/indexing.html#indexing-query
Вы также можете получить доступ к переменным в среде, добавив
@
.источник
numexpr
установленный пакет .Больше гибкости при использовании
.query
сpandas >= 0.25.0
:Август 2019 обновленный ответ
Поскольку
pandas >= 0.25.0
мы можем использовать этотquery
метод для фильтрации кадров данных с помощью методов pandas и даже имен столбцов, в которых есть пробелы. Обычно пробелы в именах столбцов приводят к ошибке, но теперь мы можем решить эту проблему с помощью обратного символа (`), см. GitHub :Использование
.query
с методомstr.endswith
:Вывод
Также мы можем использовать локальные переменные, добавив префикс
@
в нашем запросе:Вывод
источник
Более быстрых результатов можно достичь, используя numpy.where .
Например, с настройкой unubtu -
Сроки сравнения:
источник
Вот простой пример
источник
Для выбора только определенных столбцов из нескольких столбцов для данного значения в пандах:
Опции:
или
источник
Чтобы добавить к этому известному вопросу (хотя и слишком поздно): Вы также
df.groupby('column_name').get_group('column_desired_value').reset_index()
можете создать новый фрейм данных с указанным столбцом, имеющим определенное значение. НапримерВыполнить это дает:
источник
get_group()
что автоматически вернет фрейм данных. Также вы можете просто сказать «drop = True» в качестве параметраreset_index()
. Другими словами, это может быть сокращено до:b_is_two_dataframe = df.groupby('B').get_group('two').reset_index(drop=True)
Вы также можете использовать .apply:
Это на самом деле работает по строкам (то есть применяет функцию к каждой строке).
Выход
Результаты такие же, как при использовании @unutbu
источник