char fast_car[15]="Bugatti";
Он говорит, что fast_car является массивом и инициализируется строкой «Buratti». Правильное использование:
char fast_car[15];
fast_car="Bugatti";
Первая строка - это объявление массива char (не инициализировано). Во-вторых, fast_car здесь - всего лишь адрес (указатель) первого элемента в этом массиве char. Назначение указателя fast_car массиву char «Buratti» неверно по разностному типу значения.
Используйте метод isin
. rpt[rpt['STK_ID'].isin(stk_list)]
.
Вы также можете добиться аналогичных результатов, используя «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
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
и т. д.
isin
работает только для идеального соответствия, он принимает dataframes
, Series
, Index
и т. Д. @Jakevdp предоставил здесь большое решение, которое работает для извлечения совпадающих значений df1
, учитывая другое dataframe df2
: stackoverflow.com/a/33282617/4752883 . В моем случае у меня есть df2
, но значения в df2
не будут точными совпадениями, поэтому мне интересно, есть ли способ использовать regex
в isin
(или другую функцию), аналогично тому, что вы указали здесь?
– alpha_989
5 July 2018 в 19:44
Для такого кадра данных:
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
. Вы можете создать маску, которая дает вам ряд операторов 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'
Вы можете использовать query
, т. е .:
b = df.query('a > 1 & a < 5')
Вы также можете непосредственно запросить свой DataFrame для этой информации.
rpt.query('STK_ID in (600809,600141,600329)')
Или аналогичным образом искать диапазоны:
rpt.query('60000 < STK_ID < 70000')
my_list
rpt.query('STK_ID in @my_list')
– Gourneau
19 October 2016 в 23:50
вы также можете использовать диапазоны, используя:
b = df[(df['a'] > 1) & (df['a'] < 5)]
!isin()
? – stites 26 June 2013 в 16:14~
:rpt[~rpt['STK_ID'].isin(stk_list)]
– BrenBarn 26 June 2013 в 18:43isin
. – BrenBarn 27 February 2015 в 23:21df[df.index.isin(ls)]
где ls - ваш список – howMuchCheeseIsTooMuchCheese 16 September 2015 в 18:32