gpt4 book ai didi

python - 通过使用 python 和 pandas 使用 2 个现有列的函数填充新列

转载 作者:太空宇宙 更新时间:2023-11-03 20:16:29 24 4
gpt4 key购买 nike

我在根据另外 2 个行值创建和填充新列时遇到一些问题。我创建了一个函数,用于查找(在大型 CSV 文件 (1GB) 中)源和目的地邮政编码并返回特定行。

我想生成距离和时间并将其添加为订单文件中的新列。

我尝试使用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')

我遇到的另一个问题是执行calculateDistance 的执行时间是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

最佳答案

我认为您在这里可以做的最简单、最快的操作就是合并(阅读:加入)出发邮政编码和到达邮政编码上的数据帧。通过这种方式,您可以一次性获取 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
<小时/>

对于您的 block ,它看起来像这样(我自己无法测试):

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())

关于python - 通过使用 python 和 pandas 使用 2 个现有列的函数填充新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58412196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com