[英]Complex Grouping, Sorting and Value filtering in Pandas
具有以下格式的熊猫数据框:
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
我想基于以下内容创建标签(例如,高/低/ med)到新列中:基于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所示),那么我们将根据值>或分配一个高/低值
在最后一滴,每组的加热元件都胜过第一个。
因此,假设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
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
作为OP中所述的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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.