Как решить проблему с TypeError: cannot convert the series to ?

Есть такой dataframe:

       newbs longitudeY1 latitudeX1   oldbs       longitudeY2        latitudeX2     BSC   LAC
0     IR021  105.98790  52.78068  IR0505   104.2578286633  52.655474988944  396402  5244
1     IR021  105.98790  52.78068  IR1017  104.59863944009  52.384744395507  396402  5244
2     IR021  105.98790  52.78068  IR1020  104.14058703968  52.010800749578  396402  5307
3     IR021  105.98790  52.78068  IR1023  104.15358510877  52.719410098781  396402  5319
4     IR021  105.98790  52.78068  IR1030  104.20639053885  52.573995078092  396402  5244
...      ...         ...        ...     ...               ...               ...     ...   ...
4192  IR066  105.68000  54.34308  IR2964  103.24349640892  52.974271985462  401257  5272
4193  IR066  105.68000  54.34308  IR2965  105.67618886914  54.995100603944  401257  5251
4194  IR066  105.68000  54.34308  IR2969  103.47831487935  52.720066254791  401257  5259
4195  IR066  105.68000  54.34308  IR2970  103.72418234894   52.09637656718  401257  5272
4196  IR066  105.68000  54.34308  IR2981  103.85440774559  52.517154218339  401257  5272

Как мне в данной таблице применить формулу sqrt((x1-x2) * (x1-x2) + (y1-y2) * (y1-y2)) ? в моем коде он ругается на ошибку:

Traceback (most recent call last):
  File "P:\projects\FillingInDataForTheSite\py.py", line 308, in <module>
    newNeighbourTable["distance"] = math.sqrt((x1-x2) * (x1-x2) + (y1-y2) * (y1-y2))        
  File "C:\Users\david\AppData\Roaming\Python\Python310\site-packages\pandas\core\series.py", line 248, in wrapper
    raise TypeError(f"cannot convert the series to {converter}")
TypeError: cannot convert the series to <class 'float'>

Вот мой код, в комментариях это мои попытки решить проблему:

        newNeighbourTable = newdatatable.merge(olddatatable, how='cross')        
        print(" - Добавляю общую таблицу.")
        x1=newNeighbourTable["latitudeX1"].astype(float)
        x2=newNeighbourTable["latitudeX2"].astype(float)
        y1=newNeighbourTable["longitudeY1"].astype(float)
        y2=newNeighbourTable["longitudeY2"].astype(float)
        #newNeighbourTable["distance"] = ""
        newNeighbourTable["distance"] = math.sqrt((x1-x2) * (x1-x2) + (y1-y2) * (y1-y2))        
        #for i, row in newNeighbourTable.iterrows():
        #    print(ewNeighbourTable.loc[i])
            #df_index = newNeighbourTable.loc[i]
            #results = math.sqrt((x1-x2) * (x1-x2) + (y1-y2) * (y1-y2))
            #newNeighbourTable["distance"] = results
        print(newNeighbourTable)
        print(newNeighbourTable.dtypes)

Ответы (1 шт):

Автор решения: CrazyElf
newNeighbourTable["distance"] = math.sqrt((x1-x2) * (x1-x2) + (y1-y2) * (y1-y2)) 
                                ^^^^^^^^^

math работает с одиночными числами. У вас данные в виде Pandas.Series, внутри них лежат Numpy.array, поэтому Numpy умеет с ними работать:

newNeighbourTable["distance"] = np.sqrt((x1-x2) * (x1-x2) + (y1-y2) * (y1-y2)) 
                                ^^^^^^^

Обычно никогда не нужно циклы писать, если вы пишете iterrows, то вы делаете что-то неправильно. Есть или готовая функция в Pandas или Numpy, или можно написать свою функцию и применить её через map или apply к серии.

→ Ссылка