具有以下格式的熊猫数据框:
Col1 Col2 Col3
t1 m1 1
t2 m2 7
t3 m1 4
t4 m2 8
t5 m3 4
t6 m3 6
t7 m3 11
t8 m4 9
我想根据以下内容将标签(例如,高/低/中)创建到新列中: 根据Col2对数据进行分组,然后根据Col1对数据进行排序(假设升序)。完成后,我们将选择
组中排序数据的第一个匹配项(最小值),并检查以下内容:
如果组中Col3的第一个值> x:
if any of values in the remaining group <=x :
Then assign high for the first match to Col 4 #a1
else
assign med for the first match to Col4 #a2
如果组3中第3列的第一个值<= x和
中的任何值剩余组<或> = x:
Then assign low for the first match to Col 4 #b1
如果一个组中只有一个元素(如下面的m4所示),那么我们将基于值>或分配一个高/低值
最后,每个组的rmeaining元素都胜过第一个。
因此,假设x = 4并假设(t1
Col1 Col2 Col3 Col4
t1 m1 1 low
t2 m2 7 med
t3 m1 4 # should drop
t4 m2 8 # should drop
t5 m3 5 high
t6 m3 2 # should drop
t7 m3 11 # should drop
t8 m4 9 high
So final table will be like:
Col1 Col2 Col3 Col4
t1 m1 1 low
t2 m2 7 med
t5 m3 5 high
t8 m4 9 high
答案 0 :(得分:0)
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
的示例输入,将该功能应用于已排序和分组的数据框:
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