Панды: отбрасывать дублирующиеся строки с одинаковыми «округленными» значениями, не создавая новые столбцы

1

Я хочу удалить дублированные строки, чтобы значения в столбцах B и C после округления их до двух знаков после запятой равны

import pandas as pd
df = pd.DataFrame({"A":["f1", "f2", "f3", "f4"], "B":[1.2579,1.2586,1.7223,1], "C":[8.2579,8.2586,12.7223,14.0]})

   A       B        C
0  f1  1.2579   8.2579
1  f2  1.2586   8.2586
2  f3  1.7223  12.7223
3  f4  1.0000  14.0000

Здесь после округления строки 0 и 1 имеют одинаковое значение. Вместо создания столбца B_round и C_round для удаления дубликатов, подобных этому

df['B_round'] = df['B'].values.round(2)
df['C_round'] = df['C'].values.round(2)
df = df.drop_duplicates(subset=['B_round', 'C_round'], keep='first')

который я должен удалить столбцы снова

df = df.drop(['B_round', 'C_round'], axis=1)
   A       B        C
0  f1  1.2579   8.2579
2  f3  1.7223  12.7223
3  f4  1.0000  14.0000

Потому что мои реальные данные большие. Есть ли способ удалить их без создания нового набора столбцов?

Теги:
pandas
python-2.7

1 ответ

0
Лучший ответ

Используйте DataFrame.duplicated с инвертированием булевой маски с помощью ~ и boolean indexing:

df = df[~df[['B', 'C']].round(2).duplicated()]

print (df)
    A       B        C
0  f1  1.2579   8.2579
2  f3  1.7223  12.7223
3  f4  1.0000  14.0000

Другое решение - умножить на 100 и преобразовать значения в integer s:

df = df[~df[['B', 'C']].mul(100).astype(int).duplicated()]
  • 1
    Интересно, что keep='first' не имеет значения для .duplicated() здесь. Это прекрасно работает. Ты такой быстрый.
  • 0
    @Jan - это значение по умолчанию, это не важно и в drop_duplicates
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню