编辑:如果不是问题,这是循环上方的代码,可提供更多有用的答案。
import os
import pandas as pd
import numpy
import csv
from math import *
ParcelSize = 50
UARFCN = 3087
y= r"C:\Users\Heba R\Desktop\GP\Pilot1.csv"
x= r"C:\Users\Heba R\Desktop\GP\Cell.csv"
scanner_File = pd.read_csv(y)
Cell_file = pd.read_csv(x)
Cells = Cell_file[['Cell', 'Lat', 'Lon', 'SC', 'UARFCN', 'ANT_DIRECTION']]
scanner = scanner_File[
['Latitude', 'Longitude', 'PSC: Top #1 (UARFCN #01)', 'Sc Aggr Ec (dBm): Top #1 (UARFCN #01)',
'Sc Aggr Ec/Io (dB): Top #1 (UARFCN #01)',
'PSC: Top #2 (UARFCN #01)', 'Sc Aggr Ec (dBm): Top #2 (UARFCN #01)', 'Sc Aggr Ec/Io (dB): Top #2 (UARFCN #01)',
'PSC: Top #3 (UARFCN #01)', 'Sc Aggr Ec (dBm): Top #3 (UARFCN #01)', 'Sc Aggr Ec/Io (dB): Top #3 (UARFCN #01)',
'PSC: Top #4 (UARFCN #01)', 'Sc Aggr Ec (dBm): Top #4 (UARFCN #01)', 'Sc Aggr Ec/Io (dB): Top #4 (UARFCN #01)',
'PSC: Top #5 (UARFCN #01)', 'Sc Aggr Ec (dBm): Top #5 (UARFCN #01)', 'Sc Aggr Ec/Io (dB): Top #5 (UARFCN #01)',
'PSC: Top #6 (UARFCN #01)', 'Sc Aggr Ec (dBm): Top #6 (UARFCN #01)', 'Sc Aggr Ec/Io (dB): Top #6 (UARFCN #01)',
'PSC: Top #7 (UARFCN #01)', 'Sc Aggr Ec (dBm): Top #7 (UARFCN #01)', 'Sc Aggr Ec/Io (dB): Top #7 (UARFCN #01)',
'PSC: Top #8 (UARFCN #01)', 'Sc Aggr Ec (dBm): Top #8 (UARFCN #01)', 'Sc Aggr Ec/Io (dB): Top #8 (UARFCN #01)',
'PSC: Top #9 (UARFCN #01)', 'Sc Aggr Ec (dBm): Top #9 (UARFCN #01)',
'Sc Aggr Ec/Io (dB): Top #9 (UARFCN #01)']]
scanner_size = scanner.shape[0]
cells_size = Cells.shape[0]
def CalcDistanceM(lat1, lon1, lat2, lon2):
lat1, lon1, lat2, lon2 = map(radians, [lat1, lon1, lat2, lon2]) #convert decimal to rad
#haversine formula to calculate two points great circle distance on earth
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2
c = 2 * atan2(sqrt(a), sqrt(1 - a))
distance = 6371 * c * 1000 #radius of earth in km =6371
return distance
def fn_CalcParcelID(Pos, ParcelUnitSize):
if (Pos == 500): # null parcel
Result = int(50000000)
elif (Pos < 0):
Result = int(Pos * 100000) - ParcelUnitSize + (int(Pos * 100000) % ParcelUnitSize)
else:
Result = int(Pos * 100000) - (int(Pos * 100000) % ParcelUnitSize)
return int(Result)
A1=pd.DataFrame(columns=['Latitude','Longitude','PSC','EcNo','RSCP'])
A2=pd.DataFrame(columns=['Latitude','Longitude','PSC','EcNo','RSCP'])
A3=pd.DataFrame(columns=['Latitude','Longitude','PSC','EcNo','RSCP'])
A4=pd.DataFrame(columns=['Latitude','Longitude','PSC','EcNo','RSCP'])
A5=pd.DataFrame(columns=['Latitude','Longitude','PSC','EcNo','RSCP'])
A6=pd.DataFrame(columns=['Latitude','Longitude','PSC','EcNo','RSCP'])
A7=pd.DataFrame(columns=['Latitude','Longitude','PSC','EcNo','RSCP'])
A8=pd.DataFrame(columns=['Latitude','Longitude','PSC','EcNo','RSCP'])
A9=pd.DataFrame(columns=['Latitude','Longitude','PSC','EcNo','RSCP'])
for i in range (scanner_size):
#if isnan(scanner['PSC: Top #1 (UARFCN #01)'][i]) == False:
if (scanner['PSC: Top #1 (UARFCN #01)'][i]) != -1 :
A1 = A1.append({ 'Latitude': scanner['Latitude'][i], 'Longitude': scanner['Longitude'][i],
'PSC': scanner['PSC: Top #1 (UARFCN #01)'][i],'EcNo': scanner['Sc Aggr Ec/Io (dB): Top #1 (UARFCN #01)'][i],'RSCP': scanner['Sc Aggr Ec (dBm): Top #1 (UARFCN #01)'][i]}, ignore_index=True)
if (scanner['PSC: Top #2 (UARFCN #01)'][i]) !=-1:
A2 = A2.append({'Latitude': scanner['Latitude'][i], 'Longitude': scanner['Longitude'][i],
'PSC': scanner['PSC: Top #2 (UARFCN #01)'][i],
'EcNo': scanner['Sc Aggr Ec/Io (dB): Top #2 (UARFCN #01)'][i],
'RSCP': scanner['Sc Aggr Ec (dBm): Top #2 (UARFCN #01)'][i]}, ignore_index=True)
if (scanner['PSC: Top #3 (UARFCN #01)'][i]) != -1:
A3 = A3.append({'Latitude': scanner['Latitude'][i], 'Longitude': scanner['Longitude'][i],
'PSC': scanner['PSC: Top #3 (UARFCN #01)'][i],
'EcNo': scanner['Sc Aggr Ec/Io (dB): Top #3 (UARFCN #01)'][i],
'RSCP': scanner['Sc Aggr Ec (dBm): Top #3 (UARFCN #01)'][i]}, ignore_index=True)
if (scanner['PSC: Top #4 (UARFCN #01)'][i]) != -1:
A4 = A4.append({'Latitude': scanner['Latitude'][i], 'Longitude': scanner['Longitude'][i],
'PSC': scanner['PSC: Top #4 (UARFCN #01)'][i],
'EcNo': scanner['Sc Aggr Ec/Io (dB): Top #4 (UARFCN #01)'][i],
'RSCP': scanner['Sc Aggr Ec (dBm): Top #4 (UARFCN #01)'][i]}, ignore_index=True)
if (scanner['PSC: Top #5 (UARFCN #01)'][i]) != -1:
A5 = A5.append({'Latitude': scanner['Latitude'][i], 'Longitude': scanner['Longitude'][i],
'PSC': scanner['PSC: Top #5 (UARFCN #01)'][i],
'EcNo': scanner['Sc Aggr Ec/Io (dB): Top #5 (UARFCN #01)'][i],
'RSCP': scanner['Sc Aggr Ec (dBm): Top #5 (UARFCN #01)'][i]}, ignore_index=True)
if (scanner['PSC: Top #6 (UARFCN #01)'][i]) != -1:
A6 = A6.append({'Latitude': scanner['Latitude'][i], 'Longitude': scanner['Longitude'][i],
'PSC': scanner['PSC: Top #6 (UARFCN #01)'][i],
'EcNo': scanner['Sc Aggr Ec/Io (dB): Top #6 (UARFCN #01)'][i],
'RSCP': scanner['Sc Aggr Ec (dBm): Top #6 (UARFCN #01)'][i]}, ignore_index=True)
if (scanner['PSC: Top #7 (UARFCN #01)'][i]) != -1:
A7 = A7.append({'Latitude': scanner['Latitude'][i], 'Longitude': scanner['Longitude'][i],
'PSC': scanner['PSC: Top #7 (UARFCN #01)'][i],
'EcNo': scanner['Sc Aggr Ec/Io (dB): Top #7 (UARFCN #01)'][i],
'RSCP': scanner['Sc Aggr Ec (dBm): Top #7 (UARFCN #01)'][i]}, ignore_index=True)
if (scanner['PSC: Top #8 (UARFCN #01)'][i]) != -1:
A8 = A8.append({'Latitude': scanner['Latitude'][i], 'Longitude': scanner['Longitude'][i],
'PSC': scanner['PSC: Top #8 (UARFCN #01)'][i],
'EcNo': scanner['Sc Aggr Ec/Io (dB): Top #8 (UARFCN #01)'][i],
'RSCP': scanner['Sc Aggr Ec (dBm): Top #8 (UARFCN #01)'][i]}, ignore_index=True)
if (scanner['PSC: Top #9 (UARFCN #01)'][i]) != -1:
A9 = A9.append({'Latitude': scanner['Latitude'][i], 'Longitude': scanner['Longitude'][i],
'PSC': scanner['PSC: Top #9 (UARFCN #01)'][i],
'EcNo': scanner['Sc Aggr Ec/Io (dB): Top #9 (UARFCN #01)'][i],
'RSCP': scanner['Sc Aggr Ec (dBm): Top #9 (UARFCN #01)'][i]}, ignore_index=True)
A=pd.concat([A1,A2,A3,A4,A5,A6,A7,A8,A9],sort=False)
A = A[~A[['Latitude','Longitude','PSC','EcNo','RSCP']].apply(frozenset, axis=1).duplicated()] #~ is bitwise not frozenset elem remain unchanged after creation
A.to_csv('table_data_pilot.csv',index=True)
A = pd.read_csv('table_data_pilot.csv')
#A=A.iloc[:50,:].reset_index()
A_size = A.shape[0]
for i in range(A_size):
j = i +1
for j in range (A_size):
dLat=A['Latitude'][i] - A['Latitude'][j]
dLon=A['Longitude'][i] - A['Longitude'][j]
if abs(dLat) < 0.00045 and abs(dLon) < 0.00045:
distance = CalcDistanceM(A['Latitude'][j], A['Longitude'][j],
A['Latitude'][i],
A['Longitude'][i])
print (distance)
B1 = pd.DataFrame(columns=['Lat','Lon','UARFCN','PSC','SC_Avg_EcNo','SC_Avg_RSCP'])
首先,我刚开始使用Python,因此我没有太多的知识。我试图搜索类似的问题,但找不到合适的解决方案。我正在使用以下代码:
for i in range(A_size):
x1=float(fn_CalcParcelID(A['Latitude'][i], ParcelSize) )/ 100000
x2=float(fn_CalcParcelID(A['Longitude'][i], ParcelSize) ) / 100000
B1 = B1.append({'Lat': x1, 'Lon': x2,
'PSC': A ['PSC'][i],
'UARFCN':UARFCN,
'SC_Avg_EcNo':A['EcNo'][i],
'SC_Avg_RSCP': A['RSCP'][i]
}, ignore_index=True)
B1.to_csv('B1.csv')
该循环用于计算新的纬度和经度,然后制作一个新的csv文件。 A是一个具有将近23000行和42列的CSV文件
答案 0 :(得分:2)
通常,您应该避免尽可能使用for
循环在Pandas DataFrame上进行迭代。
Iteration上的Pandas文档说:
警告
遍历熊猫对象通常慢。在许多情况下,不需要手动在行上进行迭代,可以通过以下方法之一来避免:
- 来执行。
寻找一个矢量化解决方案:许多操作都可以使用内置方法或NumPy函数,(布尔)索引,…
当您有一个无法一次在整个DataFrame / Series上运行的函数时,最好使用
apply()
而不是遍历值。请参阅函数应用程序上的文档。
此外,在循环内使用append()
向DataFrame添加新行是很成问题的。
Concat上的文档对此进行了解释:
向DataFrame添加列相对较快。但是,添加一行需要一个副本,并且可能很昂贵。我们建议将预构建的记录列表传递给DataFrame构造函数,而不是通过迭代地将记录追加到其来构建DataFrame。有关更多信息,请参见附加到数据框。
如果您在循环中执行此操作,则循环的每次迭代都会将 all 数据从DataFrame复制到新的DataFrame,仅添加一行。而且,此操作每次都会变得更加昂贵,因为DataFrame会不断增长,并且每次都会有更多数据要复制。
在您的特定情况下,通过将A 整体处理,生成要附加到B1的所有行,然后执行单,可以轻松避免大多数情况em> append()
操作,这意味着您只需复制一次B1。
将它们放在一起:
rows_to_add = pd.DataFrame({
'Lat': A['Latitude'].apply(
lambda x: fn_CalcParcelID(x, ParcelSize) / 100000.0
),
'Lon': A['Longitude'].apply(
lambda x: fn_CalcParcelID(x, ParcelSize) / 100000.0
),
'PSC': A['PSC'],
'UARFCN': UARFCN,
'SC_Avg_EcNo': A['EcNo'],
'SC_Avg_RSCP': A['RSCP'],
})
B1 = B1.append(rows_to_add, ignore_index=True)
这应该使您从运行几分钟开始,而无需等待数秒钟即可完成此操作。
您可以通过使用向量化操作实现fn_CalcParcelID()
来进一步优化它。 (由于您没有向我们展示该功能的实现,因此很难告诉您该怎么做。)但是第一个优化可能就是您所需要的。提出一个有关向量化fn_CalcParcelID()
的新问题,如果您认为这样做值得。
更新:您的代码的第一部分确实存在相同问题的版本,在该循环中,您遍历scanner
CSV文件并将其重新组织为A1至A9 。 (您在每个A1 = A1.append(...)
循环中都有一个for
,因此您在循环中也确实有附加项!)
您可以通过以下方式解决此问题:
A1_rows = scanner[scanner['PSC: Top #1 (UARFCN #01)'] != -1]
A1 = pd.DataFrame({
'Latitude': A1_rows['Latitude'],
'Longitude': A1_rows['Longitude'],
'PSC': A1_rows['PSC: Top #1 (UARFCN #01)'],
'EcNo': A1_rows['Sc Aggr Ec/Io (dB): Top #1 (UARFCN #01)'],
'RSCP': A1_rows['Sc Aggr Ec (dBm): Top #1 (UARFCN #01)'],
})
对于其他8个类似的DataFrame,也是如此。
答案 1 :(得分:0)
如果您使用的是熊猫,请使用iterrows()。
for idx,row in df.iterrows():