Присвоение возрастающих целых чисел различным значениям, которые имеют одинаковые значения в предыдущих столбцах

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

Индекс Один Два Три Четыре Пять Шесть 1 А - - - - - 2 А Б С - - - 3 А Б С Ф л - 4 А Б С Ф М С 5 А Б Д г Н - 6 А Б Д ЧАС О - 7 А Б Д я п Т 8 А Б Е Дж Вопрос - 9 А Б Е К р U

И я хотел бы получить результат, подобный следующему, где отдельным идентификаторам (которые строятся поверх комбинаций предыдущих столбцов) присваивается возрастающее целое число для каждого отдельного значения:

  • Столбец «Один» имеет только 1 отдельный («А») идентификатор, поэтому все они заменяются целым числом 1.
  • Столбец «Два» имеет 2 разных идентификатора «-» и «B» (это работает как обычный pd.Categorical, потому что все они имеют одно и то же значение в столбце «Один»)
  • Колонка «Три» — это место, где все становится сложно для меня. Индекс строки 1 получает 1, потому что "-" является единственным отличным идентификатором для комбинации ("A","-" два предыдущих столбца "Один" и "Два"). Индексы строк 2, 3 и 4 также получают 1, потому что «C» является первым уникальным идентификатором для комбинации («A», «B» соответственно из столбцов «One» и «Two»). Строка 5, 6, 7 получает 2, потому что "D" является вторым уникальным идентификатором для комбинации "A", "B" и т.д...
  • Последний пример строки 3 и 4, столбец «Пять». Они получили значения 1 и 2, потому что они имеют один и тот же путь (A, B, C, F) до столбца «Четыре», но в столбце «Пять» они получили разные значения (L и M).
Индекс Один Два Три Четыре Пять Шесть 1 1 1 1 1 1 1 2 1 2 1 1 1 1 3 1 2 1 2 1 1 4 1 2 1 2 2 1 5 1 2 2 1 1 1 6 1 2 2 2 1 1 7 1 2 2 3 1 1 8 1 2 3 1 1 1 9 1 2 3 2 1 1

Извиняюсь за маленькое эссе. И спасибо за вашу помощь. Я попытался перебрать несколько групп, но я потерялся в нем.

С уважением, Дарио

Я не понимаю логики. Почему '-' и 'C' в столбце 'Three' получают один и тот же идентификатор 1?

Stef 20.02.2023 18:49

Ага. Это не имеет никакого смысла. Поведение «-» в каждом из столбцов кажется совершенно разным.

Frank Yellin 20.02.2023 18:51

Похоже на ошибку, столбец три, ряд 2,3,4 должен быть 2, а не 1

Andreas 20.02.2023 18:52

В столбце «Три», строка 1, «-» — это первый уникальный идентификатор, который имеет предыдущий путь (комбинацию) «А» и «-» в столбцах Один и Два соответственно. «C» в строке 2,3,4 также получает 1, потому что это первый идентификатор для комбинации «A» «B» в первом и втором столбцах.

Dario Bani 20.02.2023 19:03

Итак, если значение присутствует в той же строке в предыдущих столбцах, оно становится таким же, как если бы значение еще не возникло? Это не имеет никакого смысла. Я также не понимаю, почему тогда Б в «Два» получает 2. Глядя на это снова, кажется, что вы рассматриваете как предыдущие значения в ROW, так и COL, в котором находится значение. Итак, [2, Two] равно 2, потому что B является вторым уникальным значением в столбце 2 и не имеет присвоен идентификатор в столбце One. Это ваша логика?

JarroVGIT 20.02.2023 19:50

Ни один столбец Шесть не состоит из единиц. Хорошо, я сдаюсь, извините, это выше моего понимания.

JarroVGIT 20.02.2023 19:52
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
Учебник по веб-скрапингу
Учебник по веб-скрапингу
Привет, ребята... В этот раз мы поговорим о веб-скрейпинге. Целью этого обсуждения будет узнать и понять, что такое веб-скрейпинг, а также узнать, как...
Тонкая настройка GPT-3 с помощью Anaconda
Тонкая настройка GPT-3 с помощью Anaconda
Зарегистрируйте аккаунт Open ai, а затем получите ключ API ниже.
Learning Data Analytics Two: Filtering data in a DataFrame.
Learning Data Analytics Two: Filtering data in a DataFrame.
В Learning Data Analytics One: Using Python and Pandas , я рассказываю о:
3
6
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

IIUC нужно последовательно выполнять groupby.ngroup, используя предыдущий столбец как группировщик:

out = pd.DataFrame(index=df.index)

out[df.columns[0]] = df.groupby(df.columns[0]).ngroup().add(1)

for i in range(1, df.shape[1]):
    out[df.columns[i]] = (df
  .groupby(df.columns[i-1], group_keys=False)
  .apply(lambda g: g.groupby(df.columns[i]).ngroup().add(1)).squeeze()
)

print(out)

Если вам нужно сгруппировать по всем предыдущим столбцам, измените цикл на:

for i in range(1, df.shape[1]):
    out[df.columns[i]] = (df
  .groupby(list(df.columns[:i]), group_keys=False)
  .apply(lambda g: g.groupby(df.columns[i]).ngroup().add(1)).squeeze()
)

Выход:

       One  Two  Three  Four  Five  Six
Index                                  
1        1    1      1     1     1    1
2        1    2      1     1     1    1
3        1    2      1     2     1    1
4        1    2      1     2     2    1
5        1    2      2     1     1    1
6        1    2      2     2     1    1
7        1    2      2     3     1    1
8        1    2      3     1     1    1
9        1    2      3     2     1    1

Это все предыдущие столбцы. Я протестирую это завтра. Спасибо, приятель, ты настоящая легенда.

Dario Bani 20.02.2023 23:23

Дружище, действительно ценю это. У меня возник дополнительный вопрос. Результат не течет, но есть ли способ получить 0 (ноль) вместо 1, когда значения равны «-»? Все остальное должно выглядеть точно так же, та же логика, например. Второй столбец должен быть 0,1,1,1,1,1,1,1,1 и шестой столбец 0,0,0,1,0,0,1,0,1

Dario Bani 21.02.2023 10:20

Проще всего сохранить исходный код, замаскировав: out = out.mask(df.eq('-'), 0)

mozway 21.02.2023 10:40

Это работает, приятель, я знаю, что для некоторых столбцов есть «2» без «1» в качестве уникального идентификатора, но, честно говоря, это работает. Еще раз спасибо, приятель.

Dario Bani 21.02.2023 12:16

Другие вопросы по теме