Как правильно использовать векторизацию панд? - PullRequest
0 голосов
/ 31 января 2019

Согласно статье , vectorization намного быстрее, чем apply функция для столбца pandas dafaframe.

Но у меня был какой-то особый случай, подобный этому:

import pandas as pd

df = pd.DataFrame({'IP': [ '1.0.64.2', '100.23.154.63', '54.62.1.3']})

def compare3rd(ip):
    """Check if the 3dr part of an IP is greater than 100 or not"""
    ip_3rd = ip.split('.')[2]
    if int(ip_3rd) > 100:
        return True
    else:
        return False


# This works but very slow
df['check_results'] = df.IP.apply(lambda x: compare3rd(x))
print df

# This is supposed to be much faster
# But it doesn't work ...
df['check_results_2'] = compare3rd(df['IP'].values)
print df 

Полная трассировка ошибок выглядит следующим образом:

Traceback (most recent call last):
  File "test.py", line 16, in <module>
    df['check_results_2'] = compare3rd(df['IP'].values)
  File "test.py", line 6, in compare3rd
    ip_3rd = ip.split('.')[2]
AttributeError: 'numpy.ndarray' object has no attribute 'split'

Мой вопрос: как правильно использовать этот метод vectorization в этом случае?

1 Ответ

0 голосов
/ 31 января 2019

Проверьте с помощью str в pandas

df.IP.str.split('.').str[2].astype(int)>100
0    False
1     True
2    False
Name: IP, dtype: bool

Поскольку вы упоминаете vectorize

import numpy as np
np.vectorize(compare3rd)(df.IP.values)
array([False,  True, False])
...