Панды - удалить определенную последовательность из столбца - PullRequest
1 голос
/ 11 марта 2019

Я хочу удалить определенные последовательности из моего столбца, потому что они появляются много и не дают мне много дополнительной информации.База данных состоит из ребер между узлами.В этом случае будет грань между узлом 1 и узлом 1, узлом 1 и узлом 2, узлом 2 и узлом 3 .....

Однако, ребро 1-5 происходит около 80.000 раз внастоящая база данных.Я хочу отфильтровать их, сохраняя только «не очень распространенные» взаимодействия.

Допустим, мой фрейм данных выглядит следующим образом

>>> datatry
   num  line    
0   1    56
1   1    90  
2   2    66  
3   3    4  
4   1    23  
5   5    22  
6   3    144
7   5    33

У меня до сих пор было удаление последовательности, которая только повторялась:

c1 = datatry['num'].eq('1')
c2 = datatry['num'].eq(datatry['num'].shift(1))
datatry2 = datatry[(c1 & ~c2) | ~(c1)]

Как я мог изменитькод выше (который удаляет все строки, которые повторяют целое число 1 и сохраняет только первую строку со значением 1), чтобы код, который удаляет все строки, которые являются определенной последовательностью?Например: 1, а затем 5?В этом случае я хочу удалить строку со значением 1 и строку со значением 5, которые появляются в этой последовательности.Мой конечный результат в идеале был бы:

>>> datatry
   num  line    
0   1    56
1   1    90  
2   2    66  
3   3    4  
4   3    144
5   5    33

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Вот один из способов:

import numpy as np
import pandas as pd

def find_drops(seq, df):
    if seq:
        m = np.logical_and.reduce([df.num.shift(-i).eq(seq[i]) for i in range(len(seq))])
        if len(seq) == 1:
            return pd.Series(m, index=df.index)
        else:
            return pd.Series(m, index=df.index).replace({False: np.NaN}).ffill(limit=len(seq)-1).fillna(False)
    else:
        return pd.Series(False, index=df.index)


find_drops([1], df)
#0     True
#1     True
#2    False
#3    False
#4     True
#5    False
#6    False
#7    False
#dtype: bool

find_drops([1,1,2,3], df)
#0     True
#1     True
#2     True
#3     True
#4    False
#5    False
#6    False
#7    False
#dtype: bool

Тогда просто используйте эти серии для нарезки df[~find_drops([1,5], df)]

0 голосов
/ 11 марта 2019

Вы смотрели на duplicated? Это имеет значение по умолчанию keep=first. Так что вы можете просто сделать:

datatry.loc[datatry['num'].duplicated(), :]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...