Поиск и замена значения в столбцах в DataFrame pandas - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть 2 кадра данных pandas:

IpAddress_to_Country_data

lower_bound_ip_address  upper_bound_ip_address  country
1.677722e+07    16777471    Australia
1.677747e+07    16777727    China
1.677773e+07    16778239    China
1.677824e+07    16779263    Australia
1.677926e+07    16781311    China

и fraud_data :

ip_address  
7.327584e+08
3.503114e+08    
2.621474e+09    
3.840542e+09    
4.155831e+08

Мне нужно выполнить поиск, если ip_address находится между lower_bound и upper_bound, и заменить ip_address на страну. Я преобразовал dataframe в np.array:

a = np.array(fraud_data.ip_address)
b = np.array([IpAddress_to_Country_data.lower_bound_ip_address, IpAddress_to_Country_data.upper_bound_ip_address, IpAddress_to_Country_data.country])

и закодировал это, чтобы найти каждое значение, заменить его и сохранить в списке c:

for j in range(0, len(a)):
    for i in range(0, b.shape[1]):
        if b.transpose()[i][0] < a[j] < b.transpose()[i][1]:
            c.append(b.transpose()[i][2])

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

У вас есть идея улучшить это решение?

Большое вам спасибо.

1 Ответ

0 голосов
/ 05 апреля 2020

Преобразование вашего pandas массива данных в numpy массивов в первую очередь сводит на нет цель использования данных!

Вы можете использовать мощные встроенные инструменты pandas, чтобы проверить, соответствуют ли значения в ip_address находится между ip_address находится между lower_bound и ip_address находится между upper_bound

Я бы предложил сначала объединить два ваших кадра данных:

df=pd.concat([IpAddress_to_Country_data, fraud_data.reindex(IpAddress_to_Country_data.index)], axis=1)

Затем вы можете использовать between, чтобы определить, находятся ли значения в столбце 'ip_address' между значениями нижней и верхней границ:

df['ip_address'].between(df['lower_bound_ip_address'],df['upper_bound_ip_address'])

Теперь, как указал yatu в своем комментарии, это вернет столбец, полный значений False, так как все ваши IP-адреса превышают верхние границы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...