эффективно проверить два условия на наборе данных в Python - PullRequest
0 голосов
/ 03 мая 2018

Я хочу найти количество строк в наборе данных, которые удовлетворяют двум условиям:

counter = len(train[(train['tag'] == label) & (train['word'] == word)])

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

Есть ли другой способ быстрее?

обновление: Решение @jezrael почти утроило скорость, но все еще занимает слишком много времени.

это более законченный код!

for index, row in tqdm(test.iterrows()):
word = row['word']
for label in labels:
    temp1 = train.eval('tag == @label and word == @word').sum()/labelDict[label]
    temp2 = train.eval('tag == @label and tag1 == @LastLable').sum()/labelDict[label]
    temp = temp1 * temp2
    if max > temp:
        max = temp
        bestLabel = label

1 Ответ

0 голосов
/ 03 мая 2018

Использование DataFrame.eval работа с numexpr модулем и суммой True с:

counter = train.eval('tag == @label and word == @word').sum()

Другое решение, более медленное:

counter = ((train['tag'] == label) & (train['word'] == word)).sum()

Производительность:

train = pd.DataFrame({'tag':list('abaaea'),
                     'word':list('baabbb')})

print (train)

#600k rows
train = pd.concat([train] * 100000, ignore_index=True)

label = 'a'
word = 'b'

In [214]: %timeit (((train['tag'] == label) & (train['word'] == word)).sum())
10 loops, best of 3: 84.6 ms per loop

In [215]: %timeit (train.eval('tag == @label and word == @word').sum())
10 loops, best of 3: 25.8 ms per loop

In [216]: %timeit (len(train[(train['tag'] == label) & (train['word'] == word)]))
10 loops, best of 3: 90.9 ms per loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...