2017-06-28 62 views
2

我有一个下面的函数来计算一个值两个参数X,Y:应用功能的数据帧列

import numpy as np 
import math 

def some_func(pt1,pt2): 
    return math.sqrt((pt2[0]-pt1[0])*(pt2[0]-pt1[0]) + (pt2[1]-pt1[1])*(pt2[1]-pt1[1])) 

用法:

a = 1, 2 
b = 4, 5 
some_func(a,b) 
#outputs = 4.24264 
#or some_func((1,2), (4,5)) would give the same output too 

我有以下DF:

seq  x y points 
    1  2 3 (2,3) 
    1 10 5 (10,5) 
    1  6 7 (6,7) 
    2  8 9 (8,9) 
    2 10 11 (10,11) 

列“点数”是使用下面的一段代码获得的:

df["points"] = list(zip(df.loc[:, "x"], df.loc[:, "y"])) 

我想申请的some_func功能对整个DF,还通过 “序列”

我试图将它们分组:

df["value"] = some_func(df["points"].values, df["points"].shift(1).values) 
#without using groupby 

df["value"] = df.groupby("seq").points.apply(some_func) #with groupby 

但两者的他们显示TypeError说1缺少参数或不支持的数据类型。

预计DF

seq x y points  value 
    1  2 3 (2,3)  NaN 
    1 10 5 (10,5)  8.24 
    1  6 7 (6,7)  4.47 
    2  8 9 (8,9)  NaN 
    2  10 11 (10,11) 2.82 
+1

我不知道你为什么导入numpy的,然后你不使用它。我想你可以通过将你的2d点存储在np.arrays而不是元组中并且将距离计算为np.linalg.norm(pt1-pt2)来改善你的代码。 – Anon

回答

3

您可以使用groupbyDataFrameGroupBy.shift第一,但这时需要更换NaN s到元组 - 一个可能的解决方案是使用fillna。最后使用apply

s = pd.Series([(np.nan, np.nan)], index=df.index) 
df['shifted'] = df.groupby('seq').points.shift().fillna(s) 
df['values'] = df.apply(lambda x: some_func(x['points'], x['shifted']), axis=1) 
print (df) 
    seq x y points  shifted values 
0 1 2 3 (2, 3) (nan, nan)  NaN 
1 1 10 5 (10, 5)  (2, 3) 8.246211 
2 1 6 7 (6, 7)  (10, 5) 4.472136 
3 2 8 9 (8, 9) (nan, nan)  NaN 
4 2 10 11 (10, 11)  (8, 9) 2.828427 

另一种解决方案是在apply过滤掉NaN S:

df['shifted'] = df.groupby('seq').points.shift() 
f = lambda x: some_func(x['points'], x['shifted']) if pd.notnull(x['shifted']) else np.nan 
df['values'] = df.apply(f, axis=1) 
print (df) 
    seq x y points shifted values 
0 1 2 3 (2, 3)  NaN  NaN 
1 1 10 5 (10, 5) (2, 3) 8.246211 
2 1 6 7 (6, 7) (10, 5) 4.472136 
3 2 8 9 (8, 9)  NaN  NaN 
4 2 10 11 (10, 11) (8, 9) 2.828427 
0
f=lambda x,y:some_func(x,y) 
f["value"] = f(df["points"].values, df["points"].shift(1).values) 
+0

谢谢,但是它显示Index Error- IndexError:标量变量的无效索引。 – Liza

+0

@莉莎,对不起,我错过了斑点 – Eliethesaiyan