繁体   English   中英

熊猫中的复杂分组,排序和值过滤

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM