Предположим, у меня есть df
ниже:
df = pd.DataFrame({
'ID': ['a', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd'],
'V': np.array(range(0,10))
})
Я хочу groupby
переменную ID
и присваивать значения новому столбцу X
в зависимости от (1) размера каждого группа и является ли каждая строка верхней (T
), «средней» (больше похожей между верхней и нижней) (M
) или нижней (B
) строкой. Если в группе только одна строка, присваивается значение N
. В этом случае результат будет выглядеть следующим образом:
ID V X
0 a 0 N
1 b 1 T
2 b 2 B
3 c 3 T
4 c 4 M
5 c 5 B
6 d 6 T
7 d 7 M
8 d 8 M
9 d 9 B
Я могу сделать это пошагово, используя что-то вроде (для случая T
):
df.join(df.groupby('ID').filter(lambda x: len(x)>1).groupby('ID').head(1).assign(X='T').X, how='left')
Но это похоже на плохое решение. Я бы предпочел сделать все это за один go. Есть идеи?