Как исправить перепутанные индексы - PullRequest
0 голосов
/ 01 августа 2020

У меня проблема с индексами в фрейме данных. У меня есть данные, которые выглядят примерно так:

df1 = pd.DataFrame({'Name': ['ABC-123', 'DEF-456', 'GHI-789', 'JKL-321'],
'A1': [111, 222, 333, 444],
'A2': [555, 666, 777, 888],
'A3': [999, 123, 456, 789],
'A4': [101, 202, 303, 404],
'QQ': [1.3, 2.5, 3.7, 4.9]});

Я работал с данными, и в какой-то момент я создал аналогичный фрейм данных с некоторыми данными из исходного, но где-то произошло смесь индексов данных, поэтому новые данные выглядят следующим образом:

df2 = pd.DataFrame({'A1': [444, 222, 111, 333],
'A2': [888, 666, 555, 777],
'A3': [789, 123, 999, 456],
'A4': [404, 202, 101, 303]});

Данные в строках в порядке, только индексы неверны, поэтому мне нужен новый фрейм данных как есть, но с индексы строк во втором кадре данных, соответствующие индексам в первом кадре данных, то есть, например, первая строка с номерами 444, 888, 789 и 404 должна иметь индекс 3, а не 0. Как я могу это сделать? Мне, вероятно, следует сравнить каждую строку второго кадра данных с первым кадром данных, и если строка во втором кадре данных совпадает с данными в строке первого кадра данных, изменить индекс этой строки во втором кадре данных на индекс соответствующей строки первого кадра данных, но я понятия не имею, как это сделать. Есть предложения?

Обновления из комментариев:

  1. Мне нужны эти индексы, но они мне нужны правильно, поэтому они совпадают, то есть индексы во второй таблице следуют за индексами в первый. Кроме того, я не могу использовать какой-либо столбец по отдельности, поскольку не является уникальным. Только вся строка уникальна.
  2. Я, вероятно, должен добавить, что эти две таблицы не настоящие, а созданы в качестве примера, и теперь я вижу, что столбец ID вводит в заблуждение. Я изменил его на AA, чтобы избежать путаницы. Итак, как я сказал выше, столбцы не уникальны, уникальна только строка в целом. В реальных таблицах более 200 столбцов и тысячи строк.
  3. Я не могу включить код, так как он большой, сложный, и я понятия не имею, где происходит путаница. Также это не имеет значения, поскольку данные, о которых я говорю, уже собраны и сохранены в файлах CSV, поэтому два фрейма данных фактически будут импортированы из этих файлов. И вот моя проблема. Я не могу повторно запустить исходный код, даже если исправлю его, потому что это займет две недели. Мне нужно исправить индексы во втором фрейме данных, что, как я подозреваю, не так уж сложно, если кто-то знает, как это сделать. Как я уже сказал, с данными в строках все в порядке, только индексы перепутаны
  4. Нет, это просто название этой штуки, остальные данные о ней. Под индексом я подразумеваю индекс фрейма данных, поскольку он создается по умолчанию pandas при создании фрейма данных. Вся проблема в том, что я создал первый фрейм данных, импортировав данные из файла CSV, проделал очень трудоемкую работу с этими данными и экспортировал результат в другой файл CSV. Когда позже я импортировал второй файл CSV для анализа, я обнаружил, что индексы строк с одинаковыми данными не совпадают. Так что теперь мне нужно исправить индексы, иначе я потеряю около двух недель работы
  5. Да, это подмножество строк и столбцов. Данные должны быть одинаковыми, только индексы перепутаны. Если бы я мог сравнить каждую строку df2 с df1, чтобы узнать, каков индекс этой строки данных в df1, а затем изменить индекс этой строки в df2, это устранило бы проблему. Мне просто нужны индексы строк в df2, соответствующие индексам соответствующих строк df1. Индексы df2 перепутаны. Индексы в df1 такие, какими они должны быть в обоих фреймах данных.
  6. Нет, df2 имеет только некоторые столбцы df1 и некоторые строки df1, но данные будут совпадать между ними. Порядок другой, значит, индексы разные, если они одинаковые. Но я думаю, что можно отсортировать строки, чтобы индексы не были в порядке.

1 Ответ

1 голос
/ 01 августа 2020
  • pandas.concat два фрейма данных
    • concat два фрейма данных, но только в столбцах в обоих
    • порядок конкатенации имеет значение, df1 должен быть first
    • df1 принесет строки не в df2
  • Используйте .duplicated для создания маски
    • Все совпадающие строки между df1 и df2 будут True, но дополнительные строки из df1 будут False
      • Примените маску, которая удалит лишние строки
      • dfc теперь будут только повторяющиеся строки, и все строки из df1 будут первыми
    • Наконец, .drop_duplicates с keep='first' удалит все дубликаты из нижней части dfc, тем самым сохраняя только строки из df1 с правильными индексами.
import pandas as pd

# concat dataframes
dfc = pd.concat([df1[df2.columns], df2])

# drop non-duplicate rows and then drop duplicates, but keep the 1st
df2_correct_indices = dfc[dfc.duplicated(keep=False)].drop_duplicates(keep='first')

# display(df2_correct_indices)

    A1   A2   A3   A4
0  111  555  999  101
1  222  666  123  202
2  333  777  456  303
3  444  888  789  404

Используемые образцы данных

df1

df1 = pd.DataFrame({'Name': ['ABC-123', 'DEF-456', 'GHI-789', 'JKL-321', 'not_in_df2'],
                    'A1': [111, 222, 333, 444, 1000],
                    'A2': [555, 666, 777, 888, 1000],
                    'A3': [999, 123, 456, 789, 1000],
                    'A4': [101, 202, 303, 404, 1000],
                    'QQ': [1.3, 2.5, 3.7, 4.9, 1000]})

         Name    A1    A2    A3    A4      QQ
0     ABC-123   111   555   999   101     1.3
1     DEF-456   222   666   123   202     2.5
2     GHI-789   333   777   456   303     3.7
3     JKL-321   444   888   789   404     4.9
4  not_in_df2  1000  1000  1000  1000  1000.0

df2

df2 = pd.DataFrame({'A1': [444, 222, 111, 333],
                    'A2': [888, 666, 555, 777],
                    'A3': [789, 123, 999, 456],
                    'A4': [404, 202, 101, 303]})

    A1   A2   A3   A4
0  444  888  789  404
1  222  666  123  202
2  111  555  999  101
3  333  777  456  303
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...