Извлечение строк на основе шаблонов во фрейме данных - PullRequest
0 голосов
/ 08 марта 2020

Я учусь Python и работаю над одним из наборов данных следующим образом:

**Col1**                                 **Col2**      **Col3**      **Col4**  
dog                                        Z             st02          0
dog,cat                                    Z             st02          1
dog,bat,cat                                Z             st02          2
bat,cat,elephant                           Y             st02          2
dog,bat,cat,elephant                       Y             st02          3
tiger                                      Z             st01          0
lion,leopard,cheetah                       Z             st01          2
tiger,lion,leopard,cheetah                 Z             st01          3
dog,tiger,cheetah                          Y             st01          2
dog,tiger,leopard,cheetah                  Y             st01          3
eagle,jaguar,Kangaroo,zebra                Z             st02          3
cheetah,eagle,jaguar,Kangaroo,zebra        Z             st02          4

Ожидаемый результат:

**Col1**                                 **Col2**       **Col3**      **Col4**
dog,bat,cat                                Z              st02          2
dog,bat,cat,elephant                       Y              st02          3
tiger,lion,leopard,cheetah                 Z              st01          3
dog,tiger,leopard,cheetah                  Y              st01          3
cheetah,eagle,jaguar,Kangaroo,zebra        Z              st02          4

Для извлечения вышеуказанных строк в качестве вывода я попытался отследить паттерны и использовать приведенную ниже логику c:

data = pd.read_excel("data.xlsx")
data['Col4'] = data['Col1'].str.count(',')
v1 = []
v2 = []
v1.append(0)
v2.append(0)
for i in range(0,data.shape[0]-1):
    x = data['Col_2'][i]
    y = data['Col_2'][i+1]
    t1 = data['Col_3'][i]
    t2 = data['Col_3'][i+1]
    g1 = (x == y) & (t1==t2)
    d1 = data['Col_1'][i]
    d2 = data['Col_1'][i+1]
    c1 = data['Col_4'][i]
    c2 = data['Col_4'][i+1]
    flag = 0
    if(all(x in d2 for x in d1)):
      flag = 1
    g2 = (flag == 1)&(c2>c1)
    v1.append(g1)
    v2.append(g2)
    data['new_cond1'] = v1   
    data['new_cond2'] = v2   
    data['Final_flag'] = (data['new_cond1']==True)&(data['new_cond2']==True) 
    data_output = data[data['Final_flag']==True]  

Но в итоге я не получил ожидаемый результат, скорее всего несколько дополнительных строк также присутствуют в выводе. Может кто-нибудь, пожалуйста, помогите мне извлечь строки, упомянутые в ожидаемом выводе.

Обновление 2:

Когда я добавлю следующее к вышеупомянутому фрейму данных:

**Col1**                                 **Col2**      **Col3**      **Col4**  
  pigeon                                   Z             st01          0
  pigeon,parrot                            Z             st01          1
  dove,parrot                              Z             st01          1
  pigeon,parrot                            Z             st01          1
  pigeon,parrot,dove                       Z             st01          2

Ожидаемый результат будет также включать:

pigeon,parrot,dove                         Z             st01          2

Хотя максимальное значение (Col4) строки «голубь, попугай, голубь» не превышает максимальное число (Col4) в последовательной группе, оно включается как часть выходных данных. , Я думаю, это потому, что категория Col1 также имеет значение. То есть, поскольку недавно добавленная строка имеет другую категорию слов "голубь, попугай, голубь".

Заранее спасибо!

1 Ответ

0 голосов
/ 08 марта 2020

Если хотите, чтобы строки были максимальными , из Col1 для последовательных групп по Col2 и Col3, используйте:

g = df[['Col2','Col3']].ne(df[['Col2','Col3']].shift()).any(1).cumsum()
df1 = df.loc[df.groupby(g)['Col4'].idxmax()]
print (df1)
                                   Col1 Col2  Col3  Col4
2                           dog,bat,cat    Z  st02     2
4                  dog,bat,cat,elephant    Y  st02     3
7            tiger,lion,leopard,cheetah    Z  st01     3
9             dog,tiger,leopard,cheetah    Y  st01     3
11  cheetah,eagle,jaguar,Kangaroo,zebra    Z  st02     4

РЕДАКТИРОВАТЬ:

df = pd.DataFrame({'Col1': ['dog', 'dog,cat', 'dog,bat,cat', 'bat,cat,elephant', 'dog,bat,cat,elephant', 'tiger', 'lion,leopard,cheetah', 'tiger,lion,leopard,cheetah', 'dog,tiger,cheetah', 'dog,tiger,leopard,cheetah', 'eagle,jaguar,Kangaroo,zebra', 'cheetah,eagle,jaguar,Kangaroo,zebra', 'pigeon', 'pigeon,parrot', 'dove,parrot', 'pigeon,parrot', 'pigeon,parrot,dove'], 'Col2': ['Z', 'Z', 'Z', 'Y', 'Y', 'Z', 'Z', 'Z', 'Y', 'Y', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z'], 'Col3': ['st02', 'st02', 'st02', 'st02', 'st02', 'st01', 'st01', 'st01', 'st01', 'st01', 'st02', 'st02', 'st01', 'st01', 'st01', 'st01', 'st01'], 'Col4': [0, 1, 2, 2, 3, 0, 2, 3, 2, 3, 3, 4, 0, 1, 1, 1, 2]})

print (df)
                                   Col1 Col2  Col3  Col4
0                                   dog    Z  st02     0 <group1
1                               dog,cat    Z  st02     1
2                           dog,bat,cat    Z  st02     2

3                      bat,cat,elephant    Y  st02     2 <group2
4                  dog,bat,cat,elephant    Y  st02     3

5                                 tiger    Z  st01     0 <group3
6                  lion,leopard,cheetah    Z  st01     2
7            tiger,lion,leopard,cheetah    Z  st01     3

8                     dog,tiger,cheetah    Y  st01     2 <group4
9             dog,tiger,leopard,cheetah    Y  st01     3

10          eagle,jaguar,Kangaroo,zebra    Z  st02     3 <group5
11  cheetah,eagle,jaguar,Kangaroo,zebra    Z  st02     4

12                               pigeon    Z  st01     0 <group6
13                        pigeon,parrot    Z  st01     1
14                          dove,parrot    Z  st01     1
15                        pigeon,parrot    Z  st01     1
16                   pigeon,parrot,dove    Z  st01     2

g = df[['Col2','Col3']].ne(df[['Col2','Col3']].shift()).any(1).cumsum()
df1 = df.loc[df.groupby(g)['Col4'].idxmax()]
print (df1)
                                   Col1 Col2  Col3  Col4
2                           dog,bat,cat    Z  st02     2
4                  dog,bat,cat,elephant    Y  st02     3
7            tiger,lion,leopard,cheetah    Z  st01     3
9             dog,tiger,leopard,cheetah    Y  st01     3
11  cheetah,eagle,jaguar,Kangaroo,zebra    Z  st02     4
16                   pigeon,parrot,dove    Z  st01     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...