Удаление повторяющихся подкадров данных из кадра данных pandas ⇐ Python
Удаление повторяющихся подкадров данных из кадра данных pandas
Например, у меня есть фрейм данных pandas
df_dupl = pd.DataFrame({ 'EVENT_TIME': ['00:01', '00:01', '00:01', '00:03', '00:03', '00:03', '00:06', '00: 06', '00:06', '00:08', '00:08', '00:10', '00:10', '00:11', '00:11', '00:13' , '00:13', '00:13'], 'UNIQUE_ID': [123, 123, 123, 125, 125, 125, 123, 123, 123, 127, 127, 123, 123, 123, 123, 123, 123, 123], 'Значение1': ['A', 'B', 'A', 'A', 'B', 'A', 'A', 'B', 'A', 'A', 'B', ' А', 'Б', 'В', 'Б', 'А', 'Б', 'А'], 'Значение2': [0,3, 0,2, 0,2, 0,1, 1,3, 0,2, 0,3, 0,2, 0,2, 0,1, 1,3, 0,3, 0,2, 0,3, 0,2, 0,3, 0,2, 0,2] }) Я хочу удалить последовательности строк, которые имеют те же значения, что и предыдущие (по EVENT_TIME) строки с тем же UNIQUE_ID. Для примера результат должен выглядеть так:
df = pd.DataFrame({ 'EVENT_TIME': ['00:01', '00:01', '00:01', '00:03', '00:03', '00:03', '00:08', '00: 08', '00:10', '00:10', '00:11', '00:11', '00:13', '00:13', '00:13'], 'UNIQUE_ID': [123, 123, 123, 125, 125, 125, 127, 127, 123, 123, 123, 123, 123, 123, 123], 'Значение1': ['A', 'B', 'A', 'A', 'B', 'A', 'A', 'B', 'A', 'B', 'C', ' Б', 'А', 'Б', 'А'], 'Значение2': [0,3, 0,2, 0,2, 0,1, 1,3, 0,2, 0,1, 1,3, 0,3, 0,2, 0,3, 0,2, 0,3, 0,2, 0,2] }). Строки со временем 00:06 следует удалить, поскольку предыдущий подкадр данных с UNIQUE_ID 123 (время 00:01) идентичен. С другой стороны, строки со временем 00:13 должны остаться — они также идентичны строкам со временем 00:01, но между ними есть другие строки с UNIQUE_ID 123. Ключевая мысль заключается в том, что я хочу сравнивать целые субфреймы данных, а не отдельные строки.
Я могу добиться желаемого результата, используя следующую функцию, но это довольно медленно.
def del_dupl_gr(df): выход = [] для x в df['UNIQUE_ID'].unique(): prev_df = pd.DataFrame() для y в df[df['UNIQUE_ID'] == x]['EVENT_TIME'].unique(): test_df = df[(df['UNIQUE_ID'] == x) & (df['EVENT_TIME'] == y)] если не test_df.iloc[:, 2:].reset_index(drop=True).equals(prev_df.iloc[:, 2:].reset_index(drop=True)): out.append(test_df) предыдущая_df = test_df return pd.concat(out).sort_index().reset_index(drop=True) Реальный фрейм данных довольно велик (более миллиона строк), и этот цикл занимает много времени. Я уверен, что должен быть правильный (или, по крайней мере, более быстрый) способ сделать это.
Например, у меня есть фрейм данных pandas
df_dupl = pd.DataFrame({ 'EVENT_TIME': ['00:01', '00:01', '00:01', '00:03', '00:03', '00:03', '00:06', '00: 06', '00:06', '00:08', '00:08', '00:10', '00:10', '00:11', '00:11', '00:13' , '00:13', '00:13'], 'UNIQUE_ID': [123, 123, 123, 125, 125, 125, 123, 123, 123, 127, 127, 123, 123, 123, 123, 123, 123, 123], 'Значение1': ['A', 'B', 'A', 'A', 'B', 'A', 'A', 'B', 'A', 'A', 'B', ' А', 'Б', 'В', 'Б', 'А', 'Б', 'А'], 'Значение2': [0,3, 0,2, 0,2, 0,1, 1,3, 0,2, 0,3, 0,2, 0,2, 0,1, 1,3, 0,3, 0,2, 0,3, 0,2, 0,3, 0,2, 0,2] }) Я хочу удалить последовательности строк, которые имеют те же значения, что и предыдущие (по EVENT_TIME) строки с тем же UNIQUE_ID. Для примера результат должен выглядеть так:
df = pd.DataFrame({ 'EVENT_TIME': ['00:01', '00:01', '00:01', '00:03', '00:03', '00:03', '00:08', '00: 08', '00:10', '00:10', '00:11', '00:11', '00:13', '00:13', '00:13'], 'UNIQUE_ID': [123, 123, 123, 125, 125, 125, 127, 127, 123, 123, 123, 123, 123, 123, 123], 'Значение1': ['A', 'B', 'A', 'A', 'B', 'A', 'A', 'B', 'A', 'B', 'C', ' Б', 'А', 'Б', 'А'], 'Значение2': [0,3, 0,2, 0,2, 0,1, 1,3, 0,2, 0,1, 1,3, 0,3, 0,2, 0,3, 0,2, 0,3, 0,2, 0,2] }). Строки со временем 00:06 следует удалить, поскольку предыдущий подкадр данных с UNIQUE_ID 123 (время 00:01) идентичен. С другой стороны, строки со временем 00:13 должны остаться — они также идентичны строкам со временем 00:01, но между ними есть другие строки с UNIQUE_ID 123. Ключевая мысль заключается в том, что я хочу сравнивать целые субфреймы данных, а не отдельные строки.
Я могу добиться желаемого результата, используя следующую функцию, но это довольно медленно.
def del_dupl_gr(df): выход = [] для x в df['UNIQUE_ID'].unique(): prev_df = pd.DataFrame() для y в df[df['UNIQUE_ID'] == x]['EVENT_TIME'].unique(): test_df = df[(df['UNIQUE_ID'] == x) & (df['EVENT_TIME'] == y)] если не test_df.iloc[:, 2:].reset_index(drop=True).equals(prev_df.iloc[:, 2:].reset_index(drop=True)): out.append(test_df) предыдущая_df = test_df return pd.concat(out).sort_index().reset_index(drop=True) Реальный фрейм данных довольно велик (более миллиона строк), и этот цикл занимает много времени. Я уверен, что должен быть правильный (или, по крайней мере, более быстрый) способ сделать это.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Удаление строк из кадра данных pandas вызывает ключевую ошибку в загрузчике данных.
Anonymous » » в форуме Python - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Удаление строк кадра данных, в которых выбранные столбцы имеют значения na.
Anonymous » » в форуме Python - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-