Удаление дубликатов на основе столбца первого уровня в MultiIndex DataFrame - PullRequest
1 голос
/ 20 сентября 2019

У меня есть MultiIndex Pandas DataFrame, например:

+---+------------------+----------+---------+--------+-----------+------------+---------+-----------+
|   | VECTOR           | SEGMENTS | OVERALL                      | INDIVIDUAL                       |
|   |                  |          | TIP X   | TIP Y  | CURVATURE | TIP X      | TIP Y   | CURVATURE |
| 0 | (TOP, TOP)       | 2        | 3.24    | 1.309  | 44        | 1.62       | 0.6545  | 22        |
| 1 | (TOP, BOTTOM)    | 2        | 3.495   | 0.679  | 22        | 1.7475     | 0.3395  | 11        |
| 2 | (BOTTOM, TOP)    | 2        | 3.495   | -0.679 | -22       | 1.7475     | -0.3395 | -11       |
| 3 | (BOTTOM, BOTTOM) | 2        | 3.24    | -1.309 | -44       | 1.62       | -0.6545 | -22       |
+---+------------------+----------+---------+--------+-----------+------------+---------+-----------+

Как мне удалить дубликаты на основе всех столбцов, содержащихся в 'OVERALL' или 'INDIVIDUAL'?Поэтому, если я выберу 'INDIVIDUAL', чтобы удалить дубликаты из значений TIP X, TIP Y и CURVATURE в INDIVIDUAL, все должны совпадать, чтобы они были дубликатами?

И далее, как видно из таблицы 1 и 2 - это дубликаты, которые просто отражаются относительно оси x.Они также должны быть отброшены.

Кроме того, можно ли отцентрировать заголовки OVERALL и INDIVIDUAL?

РЕДАКТИРОВАТЬ: frame.drop_duplicates(subset=['INDIVIDUAL'], inplace=True) производит KeyError: Index(['INDIVIDUAL'], dtype='object')

1 Ответ

1 голос
/ 20 сентября 2019

Вы можете передать pandas .drop_duplicates подмножество кортежей для многоиндексированных столбцов:

df.drop_duplicates(subset=[
    ('INDIVIDUAL', 'TIP X'),
    ('INDIVIDUAL', 'TIP Y'),
    ('INDIVIDUAL', 'CURVATURE')
])

Или, если ваши индексы строк уникальны, вы можете использовать следующий подход, который экономит некоторую типизацию:

df.loc[df['INDIVIDUAL'].drop_duplicates().index]

Обновление :

Как вы предложили в комментариях, если вы хотите выполнять операции с кадром данных, вы можете сделать это в строке:

df.loc[df['INDIVIDUAL'].abs().drop_duplicates().index]

Или для функций не-панд вы можете использовать .transform:

df.loc[df['INDIVIDUAL'].transform(np.abs).drop_duplicates().index]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...