Удалить строки, если значение столбца указано в rejectList [duplicate]

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
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 20 August 2018 в 12:50
поделиться
  • 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 20 August 2018 в 12:50
поделиться

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

criterion = lambda row: row['countries'] not in countries
not_in = df[df.apply(criterion, axis=1)]
8
ответ дан Kos 20 August 2018 в 12:50
поделиться
  • 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 20 August 2018 в 12:50
поделиться
  • 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 20 August 2018 в 12:50
поделиться
  • 1
    Вы можете отрицать isin (как сделано в принятом ответе), а не сравнивать с False – cricket_007 19 July 2017 в 12:17
  • 2
    Это решение работает для меня. спасибо – Malek B. 21 June 2018 в 13:33
Другие вопросы по тегам:

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