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

时间:2018-10-09 21:06:00

标签: python algorithm pandas sorting

具有以下格式的熊猫数据框:

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

1 个答案:

答案 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