как удалить строки из фрейма данных в pandas, которые не соответствуют массиву значений [duplicate]

char fast_car[15]="Bugatti";

Он говорит, что fast_car является массивом и инициализируется строкой «Buratti». Правильное использование:

char fast_car[15];
fast_car="Bugatti";

Первая строка - это объявление массива char (не инициализировано). Во-вторых, fast_car здесь - всего лишь адрес (указатель) первого элемента в этом массиве char. Назначение указателя fast_car массиву char «Buratti» неверно по разностному типу значения.

286
задан firelynx 27 April 2017 в 13:28
поделиться

7 ответов

Используйте метод isin. rpt[rpt['STK_ID'].isin(stk_list)].

425
ответ дан BrenBarn 15 August 2018 в 21:14
поделиться
  • 1
    как насчет отрицания этого - что было бы правильным способом обойти !isin()? – stites 26 June 2013 в 16:14
  • 2
    @dbyte: вы просто используете оператор ~: rpt[~rpt['STK_ID'].isin(stk_list)] – BrenBarn 26 June 2013 в 18:43
  • 3
    Связано с тем, что @mathtick спросил: есть ли способ сделать это по индексу вообще (необязательно быть мультииндексом)? – user1669710 27 February 2015 в 23:11
  • 4
    @ user1669710: У индексов также есть метод isin. – BrenBarn 27 February 2015 в 23:21
  • 5
    Если кому-то нужен синтаксис для индекса: df[df.index.isin(ls)] где ls - ваш список – howMuchCheeseIsTooMuchCheese 16 September 2015 в 18:32

Вы также можете добиться аналогичных результатов, используя «query» и @:

, например:

df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'f']})
df = pd.DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3, 5]})
list_of_values = [3,6]
result= df.query("A in @list_of_values")
result
   A  B
1  6  2
2  3  3
3
ответ дан akuriako 15 August 2018 в 21:14
поделиться

isin() идеально подходит, если у вас есть список точных совпадений, но если у вас есть список частичных совпадений или подстрок, которые вы ищете, вы можете фильтровать с помощью метода str.contains и регулярного выражения.

Например, если мы хотим вернуть DataFrame, где все идентификаторы запаса, начинающиеся с '600', затем сопровождаются любыми тремя цифрами:

>>> rpt[rpt['STK_ID'].str.contains(r'^600[0-9]{3}$')] # ^ means start of string
...   STK_ID   ...                                    # [0-9]{3} means any three digits
...  '600809'  ...                                    # $ means end of string
...  '600141'  ...
...  '600329'  ...
...      ...   ...

Предположим теперь, что мы имеем список строк, которым мы хотим, чтобы значения в 'STK_ID' заканчивались, например

endstrings = ['01$', '02$', '05$']

. Мы можем присоединить эти строки с помощью регулярного выражения или символа | и передать string в str.contains для фильтрации DataFrame:

>>> rpt[rpt['STK_ID'].str.contains('|'.join(endstrings)]
...   STK_ID   ...
...  '155905'  ...
...  '633101'  ...
...  '210302'  ...
...      ...   ...

Наконец, contains может игнорировать регистр (установкой case=False), позволяя вам быть более общим при указании строк, которые вы хотите сопоставить .

Например,

str.contains('pandas', case=False)

будет соответствовать PANDAS, PanDAs, paNdAs123 и т. д.

87
ответ дан Alex Riley 15 August 2018 в 21:14
поделиться
  • 1
    Спасибо за это .. regex search будет очень полезной. Даже несмотря на то, что isin работает только для идеального соответствия, он принимает dataframes, Series, Index и т. Д. @Jakevdp предоставил здесь большое решение, которое работает для извлечения совпадающих значений df1, учитывая другое dataframe df2: stackoverflow.com/a/33282617/4752883 . В моем случае у меня есть df2, но значения в df2 не будут точными совпадениями, поэтому мне интересно, есть ли способ использовать regex в isin (или другую функцию), аналогично тому, что вы указали здесь? – alpha_989 5 July 2018 в 19:44

Данные обрезания с помощью pandas

Для такого кадра данных:

    RPT_Date  STK_ID STK_Name  sales
0 1980-01-01       0   Arthur      0
1 1980-01-02       1    Beate      4
2 1980-01-03       2    Cecil      2
3 1980-01-04       3     Dana      8
4 1980-01-05       4     Eric      4
5 1980-01-06       5    Fidel      5
6 1980-01-07       6   George      4
7 1980-01-08       7     Hans      7
8 1980-01-09       8   Ingrid      7
9 1980-01-10       9    Jones      4

Существует несколько способов выбора или резки данных.

Использование. isin

Наиболее очевидным является функция .isin. Вы можете создать маску, которая дает вам ряд операторов True / False, которые могут применяться к кадру данных следующим образом:

mask = df['STK_ID'].isin([4, 2, 6])

mask
0    False
1    False
2     True
3    False
4     True
5    False
6     True
7    False
8    False
9    False
Name: STK_ID, dtype: bool

df[mask]
    RPT_Date  STK_ID STK_Name  sales
2 1980-01-03       2    Cecil      2
4 1980-01-05       4     Eric      4
6 1980-01-07       6   George      4

Маскировка - это специальное решение проблемы , но не всегда хорошо работает с точки зрения скорости и памяти.

С индексированием

. Устанавливая индекс в столбец STK_ID, мы можем использовать объект разрезания pandas builtin sliced ​​.loc

df.set_index('STK_ID', inplace=True)
         RPT_Date STK_Name  sales
STK_ID                           
0      1980-01-01   Arthur      0
1      1980-01-02    Beate      4
2      1980-01-03    Cecil      2
3      1980-01-04     Dana      8
4      1980-01-05     Eric      4
5      1980-01-06    Fidel      5
6      1980-01-07   George      4
7      1980-01-08     Hans      7
8      1980-01-09   Ingrid      7
9      1980-01-10    Jones      4

df.loc[[4, 2, 6]]
         RPT_Date STK_Name  sales
STK_ID                           
4      1980-01-05     Eric      4
2      1980-01-03    Cecil      2
6      1980-01-07   George      4

Это быстрый способ сделать это, даже если индексирование может занять некоторое время, это экономит время, если вы хотите выполнить несколько запросов, подобных этому.

Объединение фреймов данных

Это также можно сделать, объединив данные.

stkid_df = pd.DataFrame({"STK_ID": [4,2,6]})
df.merge(stkid_df, on='STK_ID')
   STK_ID   RPT_Date STK_Name  sales
0       2 1980-01-03    Cecil      2
1       4 1980-01-05     Eric      4
2       6 1980-01-07   George      4

Примечание

Все вышеописанные методы работают, даже если имеется несколько строк с 'STK_ID'

15
ответ дан firelynx 15 August 2018 в 21:14
поделиться

Вы можете использовать query, т. е .:

b = df.query('a > 1 & a < 5')
5
ответ дан Pedro Lobito 15 August 2018 в 21:14
поделиться

Вы также можете непосредственно запросить свой DataFrame для этой информации.

rpt.query('STK_ID in (600809,600141,600329)')

Или аналогичным образом искать диапазоны:

rpt.query('60000 < STK_ID < 70000')
35
ответ дан Sanjay T. Sharma 15 August 2018 в 21:14
поделиться
  • 1
    или запросить список с именем my_list rpt.query('STK_ID in @my_list') – Gourneau 19 October 2016 в 23:50

вы также можете использовать диапазоны, используя:

b = df[(df['a'] > 1) & (df['a'] < 5)]
38
ответ дан yemu 15 August 2018 в 21:14
поделиться
Другие вопросы по тегам:

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