Комплексная группировка, сортировка и фильтрация значений в Pandas - PullRequest
0 голосов
/ 10 октября 2018

Имейте фрейм данных 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

Я хочу создать метки (скажем, hi / low / 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

Если первое значение Col 3 в группе <= x и любое из значений в </p>

оставшейся группе <или> = x:

  Then assign low for the first match to Col 4        #b1

Также, если в группе есть только один элемент (как в случае m4 ниже), тогда мы присваиваем значение high / low на основе значения> или

В конце отбрасывания остальные элементы каждой группы исключают первый,

Таким образом, предполагая, что 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 голосов
/ 10 октября 2018

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...