Фильтруйте и заменяйте значения столбцов на шаблонах пандами - python - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть два кадра данных панд (только первые несколько строк здесь):

event_timestamp      message_number  an_robot
2015-04-15 12:09:39  10125            robot_7
2015-04-15 12:09:41  10053            robot_4
2015-04-15 12:09:44  10156_added      robot_7
2015-04-15 12:09:47  20205            robot_108
2015-04-15 12:09:51  10010            robot_38
2015-04-15 12:09:54  10012            robot_65
2015-04-15 12:09:59  10011            robot_39

и (только первые две строки, максимальная длина элементов в строке последовательности составляет 5 таких строковых значений):

sequence             support
10053,10156,20205    0.94783
10010,10012          0.93322

Я хочу отфильтровать первый кадр данных по последовательностям, возникающим во втором кадре данных.У меня есть этот код по одному:

def find_drops(seq, df):
    if seq:
        m = np.logical_and.reduce([df.message_number.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)

Если я запускаю df1[~find_drops([10053,10156_added,20205], df1)], мой результат верен и выглядит следующим образом:

event_timestamp      message_number  an_robot
2015-04-15 12:09:39  10125            robot_7
2015-04-15 12:09:51  10010            robot_38
2015-04-15 12:09:54  10012            robot_65
2015-04-15 12:09:59  10011            robot_39

Однако фильтрациясуровымЯ хочу сохранить 1 строку в моем наборе данных, которая говорит мне, что эта последовательность действительно произошла (моя общая цель - суммирование журнала событий).Было бы здорово иметь что-то вроде этого, где мы объединяем значения message_number и an_robot в одну строку, и изображение все происходит в первой временной метке этой последовательности:

event_timestamp      message_number           an_robot
2015-04-15 12:09:39  10125                    robot_7
2015-04-15 12:09:41  10053,10156_added,20205  robot_4,robot_7,robot_108
2015-04-15 12:09:51  10010,10012              robot_38,robot_65
2015-04-15 12:09:59  10011                    robot_39

или мы можем просто начать отсчет сОт 0 до len (df2) всякий раз, когда появляется новая последовательность (поскольку я всегда могу посмотреть, что означает 0 в моем df2 по индексу):

event_timestamp      message_number    an_robot
2015-04-15 12:09:39  10125              robot_7
2015-04-15 12:09:41  0                  robot_4,robot_7,robot_108
2015-04-15 12:09:51  1                  robot_38,robot_65
2015-04-15 12:09:59  10011              robot_39

Я действительно не знаю, как изменить моюФункция для этого.Кроме того, было бы здорово, если бы я мог просто набрать df(find_drops(df1.iloc[0,0], df)], так как тогда я мог бы создать цикл, который делает это для df1.iloc[0,0], df1.iloc[1,0], и т. Д., Поскольку у меня есть около 500 таких последовательностей в df2.Я также не нашел способа сделать это для функции, которую я уже написал.

Надеюсь, кто-нибудь знает, что мне не хватает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...