Взять максимум в группе, оставив значение текущей строки - PullRequest
1 голос
/ 17 апреля 2019

Я хотел бы рассчитать максимальное значение в группе, но не используя собственное значение строки.

Так что, если у нас есть кадр данных, подобный этому:

d = {'col1': ["a", "a", "b", "a", "b", "a"], 'col2': [0, 4, 3, -5, -1, 2]}
df = pd.DataFrame(data=d)

print(df)

  col1  col2
0    a     0
1    a     4
2    b     3
3    a    -5
4    b    -1
5    a     2

Тогда яЯ хотел бы добавить столбец max_other следующим образом:

  col1  col2 max_other
0    a     0    4
1    a     4    2
2    b     3    -1
3    a    -5    4
4    b    -1    3
5    a     2    4

Источник: это дополнительный вопрос из этого вопроса, в котором я задал вопрос о расчете средств в группах, исключаяСобственное значение строки.

Редактировать: My max_other произошла ошибка в строке 1 (там было 3, когда должно быть 2).

1 Ответ

1 голос
/ 17 апреля 2019

вы можете попробовать с:

m=df.groupby('col1')['col2'].transform(lambda x: x.eq(x.max()))
d1=df[~m].groupby('col1')['col2'].max().to_dict()
d2=dict(zip(df.loc[m,'col1'],df.loc[m,'col2']))

df['max_other']=np.where(m,df.col1.map(d1),df.col1.map(d2))
print(df)

  col1  col2  max_other
0    a     0          4
1    a     4          2
2    b     3         -1
3    a    -5          4
4    b    -1          3
5    a     2          4

подробности: Мы создаем логическую маску, чтобы проверить, где строка равна максимальному значению группы:

m=df.groupby('col1')['col2'].transform(lambda x: x.eq(x.max()))
print(m)

0    False
1     True
2     True
3    False
4    False
5    False

Мы создаем 2 дикта:

print(d1)
{'a': 2, 'b': -1}

print(d2)
{'a': 4, 'b': 3}

Затем мы используем np.where(), чтобы увидеть, где условие соответствует, а где нет, и отобразить соответственно.

...