IIUC, возьмите этот примерный фрейм данных (у вас есть конфликтующие в вашем OP):
import pandas as pd
import numpy as np
df = pd.DataFrame([
['t1', 'm1', 1],
['t2', 'm2', 7],
['t3', 'm1', 4],
['t4', 'm2', 8],
['t5', 'm3', 5],
['t6', 'm3', 2],
['t7', 'm3', 11],
['t8', 'm4', 9]],
columns=['Col1', 'Col2', 'Col3'])
Выход:
Col1 Col2 Col3
0 t1 m1 1
1 t2 m2 7
2 t3 m1 4
3 t4 m2 8
4 t5 m3 5
5 t6 m3 2
6 t7 m3 11
7 t8 m4 9
Затем определите свою функцию с помощью вашей логики:
def my_function(x, val):
if x.shape[0]==1:
if x.iloc[0]>val:
return 'high'
else:
return 'low'
if x.iloc[0]>val and any(i<=val for i in x.iloc[1:]):
return 'high'
elif x.iloc[0]>val:
return 'med'
elif x.iloc[0]<=val:
return 'low'
else:
return np.nan
Теперь примените эту функцию к вашему отсортированному и сгруппированному фрейму данных, используя 4
в качестве примера ввода для x
, как указано в вашем OP:
df['Col4'] = df.sort_values(['Col2','Col1']).groupby('Col2')['Col3'].transform(my_function, (4))
df = df.sort_values(['Col2','Col1']).groupby('Col2').first().reset_index()
Это дает:
Col2 Col1 Col3 Col4
0 m1 t1 1 low
1 m2 t2 7 med
2 m3 t5 5 high
3 m4 t8 9 high