Извлечение записи из базы данных pandas на основе нескольких условий [duplicate]

Мне нужно было выяснить IP-адрес хоста системы для эмулятора «Nox App Player». Вот как я понял, что это 172.17.100.2.

  1. Установил эмулятор терминала Android из магазина приложений
  2. Issue ip link show для отображения всех сетевых интерфейсов. Особый интерес представлял интерфейс eth1 interface
  3. Issue ifconfig eth1, показывающий net как 172.17.100.15/255.255.255.0
  4. Начните пинговые адреса, начиная с 172.17.100.1, получили удар по `172.17.100.2 ». Не уверен, что брандмауэр будет вмешиваться, но это не в моем случае

Возможно, это может помочь кому-то понять его для других эмуляторов.

152
задан smci 17 July 2015 в 20:25
поделиться

5 ответов

Вы можете использовать pd.Series.isin .

Для «IN» используйте: something.isin(somewhere)

Или для «NOT IN»: ~something.isin(somewhere)

В качестве обработанного примера:

>>> df
  countries
0        US
1        UK
2   Germany
3     China
>>> countries
['UK', 'China']
>>> df.countries.isin(countries)
0    False
1     True
2    False
3     True
Name: countries, dtype: bool
>>> df[df.countries.isin(countries)]
  countries
1        UK
3     China
>>> df[~df.countries.isin(countries)]
  countries
0        US
2   Germany
346
ответ дан jpp 21 August 2018 в 14:56
поделиться
  • 1
    isin не является обратным sin()? : D – Kos 13 November 2013 в 19:15
  • 2
    Просто FYI, @LondonRob имел его как DataFrame, а ваш - серия. DataFrame's isin добавлен в .13. – TomAugspurger 13 November 2013 в 20:07
  • 3
    Любые предложения о том, как это сделать с помощью pandas 0.12.0? Это текущая выпущенная версия. (Может, мне стоит подождать 0,13 ?!) – LondonRob 13 November 2013 в 20:41
  • 4
    @TomAugspurger: как обычно, я, вероятно, что-то пропустил. df, как мое, так и его, является DataFrame. countries - это список. df[~df.countries.isin(countries)] создает DataFrame, а не Series, и, похоже, работает еще в 0.11.0.dev-14a04dd. – DSM 14 November 2013 в 18:10
  • 5
    Этот ответ запутан, потому что вы повторно используете переменную countries. Ну, OP делает это, и это унаследовано, но что-то сделано плохо, прежде чем не оправдывает это плохо. – ifly6 18 May 2018 в 22:20
df = pd.DataFrame({'countries':['US','UK','Germany','China']})
countries = ['UK','China']

реализовать в:

df[df.countries.isin(countries)]

реализовать не так, как в странах покоя:

df[df.countries.isin([x for x in np.unique(df.countries) if x not in countries])]
1
ответ дан Ioannis Nasios 21 August 2018 в 14:56
поделиться

Обычно я делаю общую фильтрацию по строкам следующим образом:

criterion = lambda row: row['countries'] not in countries
not_in = df[df.apply(criterion, axis=1)]
8
ответ дан Kos 21 August 2018 в 14:56
поделиться
  • 1
    FYI, это намного медленнее, чем @DSM soln, который векторизован – Jeff 13 November 2013 в 19:47
  • 2
    @Jeff Я бы ожидал этого, но это то, к чему я возвращаюсь, когда мне нужно фильтровать что-то недоступное в пандах прямо. (Я собирался сказать «like» или «regex matching», но только что узнал о Series.str, который имеет все это!) – Kos 14 November 2013 в 09:42

Альтернативное решение, использующее метод .query () :

In [5]: df.query("countries in @countries")
Out[5]:
  countries
1        UK
3     China

In [6]: df.query("countries not in @countries")
Out[6]:
  countries
0        US
2   Germany
13
ответ дан MaxU 21 August 2018 в 14:56
поделиться
  • 1
    Обратите внимание, что это в настоящее время отмечено как «экспериментальное» в документах ... – LondonRob 19 July 2017 в 14:49

Я хотел отфильтровать строки dfbc, у которых был BUSINESS_ID, который также был в BUSINESS_ID dfProfilesBusIds

. Наконец, он работал:

dfbc = dfbc[(dfbc['BUSINESS_ID'].isin(dfProfilesBusIds['BUSINESS_ID']) == False)]
1
ответ дан Sam Henderson 21 August 2018 в 14:56
поделиться
  • 1
    Вы можете отрицать isin (как сделано в принятом ответе), а не сравнивать с False – cricket_007 19 July 2017 в 12:17
  • 2
    Это решение работает для меня. спасибо – Malek B. 21 June 2018 в 13:33
Другие вопросы по тегам:

Похожие вопросы: