Grouped-By DataFrame:在函数的当前行和上一行中使用列值
Grouped-By DataFrame: Use column-values in current and previous row in Function
我有一个具有这种结构的数据框:
import pandas as pd
from geopy.distance import vincenty
data = {'id': [1, 2, 3, 1, 2 , 3],
'coord': [[10.1, 30.3], [10.5, 32.3], [11.1, 31.3],
[10.1, 30.3], [10.5, 32.3], [61, 29.1]],
}
df = pd.DataFrame(data)
这是它的样子:
coord id
0 [10.1, 30.3] 1
1 [10.5, 32.3] 2
2 [11.1, 31.3] 3
3 [10.1, 30.3] 1
4 [10.5, 32.3] 2
5 [61, 29.1] 3
现在,我想按 id
分组。然后,我想使用 coords
的当前行和上一行。这些应该在函数中使用来计算两个坐标之间的距离:
这是我试过的:
df.groupby('id')['coord'].apply(lambda x: vincenty(x, x.shift(1)))
vincenty(x,y)
期望 x
像 (10, 20) 一样,y
和 returns 也是一个浮点数。
显然,这是行不通的。该函数接收两个 Series 对象而不是两个列表。所以可能使用 x.values.tolist()
应该是下一步。然而,我对事物的理解到此为止。因此,对于如何解决这个问题,我将不胜感激!
我认为你需要每组 shift
列,然后应用过滤掉 NaN
s 行的函数:
def vincenty(x, y):
print (x,y)
return x + y
df['new'] = df.groupby('id')['coord'].shift()
m = df['new'].notnull()
df.loc[m, 'out'] = df.loc[m, :].apply(lambda x: vincenty(x['coord'], x['new']), axis=1)
print (df)
coord id new out
0 [10.1, 30.3] 1 NaN NaN
1 [10.5, 32.3] 2 NaN NaN
2 [11.1, 31.3] 3 NaN NaN
3 [10.1, 30.3] 1 [10.1, 30.3] [10.1, 30.3, 10.1, 30.3]
4 [10.5, 32.3] 2 [10.5, 32.3] [10.5, 32.3, 10.5, 32.3]
5 [61, 29.1] 3 [11.1, 31.3] [61, 29.1, 11.1, 31.3]
我有一个具有这种结构的数据框:
import pandas as pd
from geopy.distance import vincenty
data = {'id': [1, 2, 3, 1, 2 , 3],
'coord': [[10.1, 30.3], [10.5, 32.3], [11.1, 31.3],
[10.1, 30.3], [10.5, 32.3], [61, 29.1]],
}
df = pd.DataFrame(data)
这是它的样子:
coord id
0 [10.1, 30.3] 1
1 [10.5, 32.3] 2
2 [11.1, 31.3] 3
3 [10.1, 30.3] 1
4 [10.5, 32.3] 2
5 [61, 29.1] 3
现在,我想按 id
分组。然后,我想使用 coords
的当前行和上一行。这些应该在函数中使用来计算两个坐标之间的距离:
这是我试过的:
df.groupby('id')['coord'].apply(lambda x: vincenty(x, x.shift(1)))
vincenty(x,y)
期望 x
像 (10, 20) 一样,y
和 returns 也是一个浮点数。
显然,这是行不通的。该函数接收两个 Series 对象而不是两个列表。所以可能使用 x.values.tolist()
应该是下一步。然而,我对事物的理解到此为止。因此,对于如何解决这个问题,我将不胜感激!
我认为你需要每组 shift
列,然后应用过滤掉 NaN
s 行的函数:
def vincenty(x, y):
print (x,y)
return x + y
df['new'] = df.groupby('id')['coord'].shift()
m = df['new'].notnull()
df.loc[m, 'out'] = df.loc[m, :].apply(lambda x: vincenty(x['coord'], x['new']), axis=1)
print (df)
coord id new out
0 [10.1, 30.3] 1 NaN NaN
1 [10.5, 32.3] 2 NaN NaN
2 [11.1, 31.3] 3 NaN NaN
3 [10.1, 30.3] 1 [10.1, 30.3] [10.1, 30.3, 10.1, 30.3]
4 [10.5, 32.3] 2 [10.5, 32.3] [10.5, 32.3, 10.5, 32.3]
5 [61, 29.1] 3 [11.1, 31.3] [61, 29.1, 11.1, 31.3]