Pandas groupby - расчет расстояния от относительной точки - PullRequest
2 голосов
/ 14 октября 2019

Допустим, у меня есть кое-что, похожее на это

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]})

Что я хочу сделать, это создать новый столбец, который будет отличаться от Number от True в ref. Таким образом, для группы 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 ]

2 голосов
/ 14 октября 2019

В вашем случае

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
2 голосов
/ 14 октября 2019

Вы можете сделать следующее:

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

This: df.groupby('Event')['Ref'].transform('idxmax') заполнить найти индексы по группе, где Ref = True. В основном он находит индексы максимальных значений, поэтому, учитывая, что True = 1 и False = 0, он находит индексы истинных значений.

1 голос
/ 14 октября 2019

Попробуйте where и преобразование Гроуби 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...