Фильтруйте строку панд, где 1-я буква в столбце является / не является определенным значением - PullRequest
0 голосов
/ 01 октября 2018

как отфильтровать серию данных (в pandas dataFrame), где я не хочу, чтобы 1-я буква была «Z», или любой другой символ.

У меня есть следующие pandas dataFrame, df, (из которых> 25 000 строк).

TIME_STAMP  Activity    Action  Quantity    EPIC    Price   Sub-activity    Venue
0   2017-08-30 08:00:05.000 Allocation  BUY 50  RRS 77.6    CPTY    066
1   2017-08-30 08:00:05.000 Allocation  BUY 50  RRS 77.6    CPTY    066
3   2017-08-30 08:00:09.000 Allocation  BUY 91  BATS    47.875  CPTY    PXINLN
4   2017-08-30 08:00:10.000 Allocation  BUY 43  PNN 8.07    CPTY    WCAPD
5   2017-08-30 08:00:10.000 Allocation  BUY 270 SGE 6.93    CPTY    PROBDMAD

Я пытаюсь удалить все строки, где первая буква места - 'Z'.

Например, мойобычный код фильтра будет выглядеть примерно так (отфильтровывать все строки, где Venue = '066'

df = df[df.Venue != '066']

. Я вижу, что эта строка фильтра отфильтровывает то, что мне нужно, по массиву, но я не уверен, как указатьэто в контексте фильтра.

[k for k in df.Venue if 'Z' not in k]

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Для случая, когда не имеет NaN значения, вы можете преобразовать представление NumPy серии в тип '<U1' и проверить равенство:

df1 = df[df['A'].values.astype('<U1') != 'Z']

Производительностьбенчмаркинг

from string import ascii_uppercase
from random import choice

L = [''.join(choice(ascii_uppercase) for _ in range(10)) for i in range(100000)]
df = pd.DataFrame({'A': L})

%timeit df['A'].values.astype('<U1') != 'Z'       # 4.05 ms per loop
%timeit [x[0] != 'Z' for x in df['A']]            # 11.9 ms per loop
%timeit [not x.startswith('Z') for x in df['A']]  # 23.7 ms per loop
%timeit ~df['A'].str.startswith('Z')              # 53.6 ms per loop
%timeit df['A'].str[0] != 'Z'                     # 53.7 ms per loop
%timeit ~df['A'].str.contains('^Z')               # 127 ms per loop
0 голосов
/ 01 октября 2018

Используйте str[0] для выбора первого значения или используйте startswith, contains с регулярным выражением ^ для начала строки.Для перевернутой булевой маски используется ~:

df1 = df[df.Venue.str[0] != 'Z']

df1 = df[~df.Venue.str.startswith('Z')]

df1 = df[~df.Venue.str.contains('^Z')]

Если нет значений NaN s быстрее, используйте понимание списка:

df1 = df[[x[0] != 'Z' for x in df.Venue]]

df1 = df[[not x.startswith('Z') for x in df.Venue]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...