Python 在int和series之差的数据帧计数幂上应用函数
我正在尝试使用apply函数向dataframe添加一个新列。我需要计算第0行和所有其他行中X和Y坐标之间的距离,我创建了以下逻辑:Python 在int和series之差的数据帧计数幂上应用函数,python,pandas,dataframe,lambda,Python,Pandas,Dataframe,Lambda,我正在尝试使用apply函数向dataframe添加一个新列。我需要计算第0行和所有其他行中X和Y坐标之间的距离,我创建了以下逻辑: import pandas as pd import numpy as np 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) def countDistance(lat1, lon1, lat2
import pandas as pd
import numpy as np
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)
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 distance
def 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 here
recModif(df)
但这总是返回错误:ValueError:传递的项目数错误9,位置意味着
我认为,由于x和y是标量,所以使用
np.repeat
可能会有帮助,但没有,错误仍然是一样的。我看到了类似的帖子,例如,但是使用简单的乘法,如何实现我所需要的减法?在.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
.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
解决方案
试试这个:
##方法1
df['dist']=((df.X-df.X[0])**2+(df.Y-df.Y[0])**2)**0.5
##方法2:。应用()
x、 y=df.x[0],df.y[0]
df['dist']=df.apply(λ行:((行X-X)**2+(行Y-Y)**2)**0.5,轴=1)
输出:
#打印(df.to_标记(index=False))
|X | Y |值|距离|
|----:|----:|--------:|---------:|
| 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 |
虚拟数据
将熊猫作为pd导入
数据={
“X”:[0,0,0,1,1,5,6,7,8],
“Y”:[0,1,4,2,6,5,6,4,8],
“值”:[6,7,4,5,6,5,6,4,8]
}
df=pd.DataFrame(数据)
解决方案
试试这个:
##方法1
df['dist']=((df.X-df.X[0])**2+(df.Y-df.Y[0])**2)**0.5
##方法2:。应用()
x、 y=df.x[0],df.y[0]
df['dist']=df.apply(λ行:((行X-X)**2+(行Y-Y)**2)**0.5,轴=1)
输出:
#打印(df.to_标记(index=False))
|X | Y |值|距离|
|----:|----:|--------:|---------:|
| 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 |
虚拟数据
将熊猫作为pd导入
数据={
“X”:[0,0,0,1,1,5,6,7,8],
“Y”:[0,1,4,2,6,5,6,4,8],
“值”:[6,7,4,5,6,5,6,4,8]
}
df=pd.DataFrame(数据)
为了实现您的最终目标,我建议将函数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
为了实现您的最终目标,我建议将函数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
@鲁丽,请看看这个。如果你有任何问题,请告诉我。这不算我需要的,你可以省略减法here@Ruli更新了解决方案。请现在检查。@Ruli请看一下这个。如果你有任何问题,请告诉我。这不算我需要的,你可以省略减法here@Ruli更新了解决方案。请现在检查。