У меня есть два кадра данных панд (только первые несколько строк здесь):
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.Я также не нашел способа сделать это для функции, которую я уже написал.
Надеюсь, кто-нибудь знает, что мне не хватает!