Заполните новый столбец функцией, которая использует 2 существующих столбца с python и pandas - PullRequest
1 голос
/ 16 октября 2019

У меня возникли проблемы с созданием и заполнением нового столбца на основе двух других значений строки. Я создал функцию, которая находит (в большом CSV-файле (1 ГБ)) исходный и целевой почтовый индекс и возвращает указанную строку.

Я хочу сгенерировать расстояние и время и добавить его в качестве нового столбца в файл заказов.

Я пытался сделать это с помощью orders.apply (), чем я получаю эту ошибку

  File "pandas\_libs\index.pyx", line 88, in pandas._libs.index.IndexEngine.get_value
  File "pandas\_libs\index.pyx", line 128, in pandas._libs.index.IndexEngine.get_loc
  File "pandas\_libs\index_class_helper.pxi", line 91, in pandas._libs.index.Int64Engine._check_type
KeyError: ('customer_address', 'occurred at index datetime') 

Еще одна проблема, с которой я столкнулся, заключается в том, что время выполнения для расчета convertDistance составляет 20 секунд. Мне интересно, есть ли какие-либо улучшения производительности, которые я могу сделать.


import pandas as pd

orders = pd.read_csv('ordersModified.csv', delimiter=';', encoding="ISO-8859-1")
distance_chunks = pd.read_csv('PostcodeDistances.csv', chunksize=100000)

def calculateDistance(src, dest):
    result = pd.concat([chunk[(chunk['src'] == src) & (chunk['dest'] == dest)] for chunk in distance_chunks])
    return result


orders['distance_meters'] = orders.apply(lambda row: calculateDistance(row['customer_address'], row['restaurant_address']).meters)

distance = calculateDistance("9727KE", "9742PA")
print(distance.meters)
print(distance.seconds)

orderModified.csv выглядит так:

datetime;restaurant;customer_address;amount;restaurant_address
2018-01-01 09:01:48;Name;9728AC;59.93;9717BB
2018-01-01 09:02:13;Name;9712AN;110.73;9727KE
2018-01-01 09:02:52;Name;9732MC;22.30;9726BD
2018-01-01 09:03:21;Name;9743KX;63.98;9718CS
2018-01-01 09:03:59;Name;9721BJ;37.93;9726BD
2018-01-01 09:04:38;Name;9713JL;37.87;9728VJ
2018-01-01 09:05:03;Name;9728VD;70.07;9718CB
2018-01-01 09:05:45;Name;9721VW;75.32;9718CP

PostcodeDistances.csv выглядит следующим образом (29.003.611 строк):

src,dest,meters,seconds
9728AC,9717BB,22.5,5.5
9711AA,9711AC,55.1,13.2
9711AA,9711AD,93.6,22.5
9711AA,9711AE,135.5,32.6

1 Ответ

0 голосов
/ 16 октября 2019

Я думаю, что самое простое и быстрое, что вы можете сделать здесь, - это merge (читай: join) как фреймы данных с неисправным почтовым кодом, так и почтовый индекс прибытия. Таким образом, вы получите всю информацию meters + seconds в вашем order кадре данных за один раз.

Код для предоставленных тестовых данных:

orders.merge(distance_chunks, 
             left_on=['customer_address', 'restaurant_address'],
             right_on=['src', 'dest']).drop(['src', 'dest'], axis=1)

Выход

             datetime restaurant customer_address  amount restaurant_address  meters  seconds
0 2018-01-01 09:01:48       Name           9728AC   59.93             9717BB    22.5      5.5

Для вашего chunks это будет выглядеть так (сам не могу это проверить):

dfs = []
for chunk in distance_chunk:
    dfs.append(
    orders.merge(chunk, 
             left_on=['customer_address', 'restaurant_address'],
             right_on=['src', 'dest']).drop(['src', 'dest'], axis=1)
    )

final_df = pd.concat(dfs, ignore_index=True)

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