亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在數據幀上應用函數計算 int 和 series 之間的差異冪

在數據幀上應用函數計算 int 和 series 之間的差異冪

守候你守候我 2023-12-20 16:03:08
我正在嘗試使用 apply 函數向數據框添加新列。我需要計算第 0 行和所有其他行中 X 和 Y 坐標之間的距離,我創建了以下邏輯:import pandas as pdimport numpy as npdata = {'X':[0,0,0,1,1,5,6,7,8],'Y':[0,1,4,2,6,5,6,4,8],'Value':[6,7,4,5,6,5,6,4,8]}df = pd.DataFrame(data)def countDistance(lat1, lon1, lat2, lon2):        print(lat1, lon1, lat2, lon2)        #use basic knowledge about triangles - values are in meters        distance = np.sqrt(np.power(lat1-lat2,2)+np.power(lon1-lon2,2))        return distancedef recModif(df):        x = df.loc[0,'X']        y = df.loc[0,'Y']        df['dist'] = df.apply(lambda n: countDistance(x,y,df['X'],df['Y']), axis=1)        #more code will come hererecModif(df)但這總是返回錯誤:ValueError: Wrong number of items passed 9, placement implies我認為由于 x 和 y 是標量,使用np.repeat可能有幫助,但沒有幫助,錯誤仍然是相同的。我看到類似的帖子,例如this,但是乘法很簡單,我怎樣才能實現我需要的減法呢?
查看完整描述

3 回答

?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

中的變量名稱.apply()混亂并與外部作用域發生沖突。避免這種情況,代碼就可以工作了。


df['dist'] = df.apply(lambda row: countDistance(x,y,row['X'],row['Y']), axis=1)


df

   X  Y  Value       dist

0  0  0      6   0.000000

1  0  1      7   1.000000

2  0  4      4   4.000000

3  1  2      5   2.236068

4  1  6      6   6.082763

5  5  5      5   7.071068

6  6  6      6   8.485281

7  7  4      4   8.062258

8  8  8      8  11.313708

另請注意, np.power() 和 np.sqrt() 已經矢量化,因此 .apply 本身對于給定的數據集是多余的:


countDistance(x,y,df['X'],df['Y'])


Out[154]: 

0     0.000000

1     1.000000

2     4.000000

3     2.236068

4     6.082763

5     7.071068

6     8.485281

7     8.062258

8    11.313708

dtype: float64


查看完整回答
反對 回復 2023-12-20
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

為了實現您的最終目標,我建議將函數 recModif 更改為:


def recModif(df):

    x = df.loc[0,'X']

    y = df.loc[0,'Y']

    df['dist'] = countDistance(x,y,df['X'],df['Y'])

    #more code will come here

這輸出


X   Y   Value   dist

0   0   0   6   0.000000

1   0   1   7   1.000000

2   0   4   4   4.000000

3   1   2   5   2.236068

4   1   6   6   6.082763

5   5   5   5   7.071068

6   6   6   6   8.485281

7   7   4   4   8.062258

8   8   8   8   11.313708


查看完整回答
反對 回復 2023-12-20
?
德瑪西亞99

TA貢獻1770條經驗 獲得超3個贊

解決方案

嘗試這個:


## Method-1

df['dist'] = ((df.X - df.X[0])**2 + (df.Y - df.Y[0])**2)**0.5


## Method-2: .apply()

x, y = df.X[0], df.Y[0]

df['dist'] = df.apply(lambda row: ((row.X - x)**2 + (row.Y - y)**2)**0.5, axis=1)

輸出:


# print(df.to_markdown(index=False))


|   X |   Y |   Value |     dist |

|----:|----:|--------:|---------:|

|   0 |   0 |       6 |  0       |

|   0 |   1 |       7 |  1       |

|   0 |   4 |       4 |  4       |

|   1 |   2 |       5 |  2.23607 |

|   1 |   6 |       6 |  6.08276 |

|   5 |   5 |       5 |  7.07107 |

|   6 |   6 |       6 |  8.48528 |

|   7 |   4 |       4 |  8.06226 |

|   8 |   8 |       8 | 11.3137  |

虛擬數據

import pandas as pd

data = {

    'X': [0,0,0,1,1,5,6,7,8],

    'Y': [0,1,4,2,6,5,6,4,8],

    'Value':[6,7,4,5,6,5,6,4,8]

}

df = pd.DataFrame(data)


查看完整回答
反對 回復 2023-12-20
  • 3 回答
  • 0 關注
  • 197 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號