Pandas分组 - 计算相对点的距离

3
假设我有以下内容:
df = pd.DataFrame({'Event':['A','A','A','A', 'A' ,'B','B','B','B','B'],  'Number':[1,2,3,4,5,6,7,8,9,10],'Ref':[False,False,False,False,True,False,False,False,True,False]})

我想要做的是创建一个新列,其中包含与ref中True的数字差异。因此,对于A组,True是最后一个,因此该列将显示为-4,-3,-2,-1,0。我一直在考虑以下操作:
for col in df.groupby('Event'):
    temp = col[1]
    reference = temp[temp.Ref==True]
    dist1 = temp.apply(lambda x:x.Number-reference.Number,axis=1)

这似乎能正确地为每个组计算,但我不确定如何将结果连接到df中。
3个回答

3
在您的情况下
df['new']=(df.set_index('Event').Number-df.query('Ref').set_index('Event').Number).to_numpy()
df
  Event  Number    Ref  new
0     A       1  False   -4
1     A       2  False   -3
2     A       3  False   -2
3     A       4  False   -1
4     A       5   True    0
5     B       6  False   -3
6     B       7  False   -2
7     B       8  False   -1
8     B       9   True    0
9     B      10  False    1

1
这是对 query 的创造性运用 :) +1 - Andy L.

2
您可以执行以下操作:
df["new"] = df.Number - df.Number[df.groupby('Event')['Ref'].transform('idxmax')].reset_index(drop=True)
print(df)

输出

  Event  Number    Ref  new
0     A       1  False   -4
1     A       2  False   -3
2     A       3  False   -2
3     A       4  False   -1
4     A       5   True    0
5     B       6  False   -3
6     B       7  False   -2
7     B       8  False   -1
8     B       9   True    0
9     B      10  False    1

这个代码:df.groupby('Event')['Ref'].transform('idxmax') 会按照组查找Ref为 True 的索引。基本上它会找到最大值的索引,所以如果True = 1,False = 0,那么它就会找到True值的索引。


谢谢。这比我想要的循环简单得多。transform('idxmax')是什么意思? - yankeefan11
@yankeefan11 已更新答案。 - Dani Mesejo

1
尝试使用wheregroupby转换first
s = df.Number.where(df.Ref).groupby(df.Event).transform('first')
df.Number - s

Out[319]:
0   -4.0
1   -3.0
2   -2.0
3   -1.0
4    0.0
5   -3.0
6   -2.0
7   -1.0
8    0.0
9    1.0
Name: Number, dtype: float64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接