Рассмотрим этот фрейм данных.

df = pd.DataFrame(data={'one': list('abcd'),
                        'two': list('efgh'),
                        'three': list('ajha')})
  one two three
0   a   e     a
1   b   f     j
2   c   g     h
3   d   h     a

Как я могу вывести все повторяющиеся значения и их соответствующий индекс? Результат может выглядеть примерно так.

  id value
0  2     h
1  3     h
2  0     a
3  0     a
4  3     a
1
user2962397 17 Сен 2021 в 23:56

3 ответа

Лучший ответ

Попробуйте .melt + .duplicated:

x = df.reset_index().melt("index")
print(
    x.loc[x.duplicated(["value"], keep=False), ["index", "value"]]
    .reset_index(drop=True)
    .rename(columns={"index": "id"})
)

Печать:

   id value
0   0     a
1   3     h
2   0     a
3   2     h
4   3     a
2
Andrej Kesely 17 Сен 2021 в 21:02

Мы можем stack DataFrame, используйте Series.loc, чтобы сохранить только там, где value - это Series.duplicated затем Series.reset_index для преобразования в DataFrame:

new_df = (
    df.stack()  # Convert to Long Form
        .droplevel(-1).rename_axis('id')  # Handle MultiIndex
        .loc[lambda x: x.duplicated(keep=False)]  # Filter Values
        .reset_index(name='value')  # Make Series a DataFrame
)

new_df:

   id value
0   0     a
1   0     a
2   2     h
3   3     h
4   3     a
2
Henry Ecker 17 Сен 2021 в 21:16

Я использовал здесь melt для изменения формы и duplicated(keep=False) для выбора дубликатов:

(df.rename_axis('id')
   .reset_index()
   .melt(id_vars='id')
   .loc[lambda d: d['value'].duplicated(keep=False), ['id','value']]
   .sort_values(by='id')
   .reset_index(drop=True)
 )

Выход:

    id value
0   0     a
1   0     a
2   2     h
3   3     h
4   3     a
2
mozway 17 Сен 2021 в 21:18