Замените жестко закодированные значения фактическими значениями

У меня есть такой список

key_fields = ['first_name', 'last_name']

И еще один такой код

df1 = df1.set_index(['first_name', 'last_name', df1.groupby(['first_name', 'last_name']).cumcount()])

Я хочу заменить жестко запрограммированные значения во второй строке на первую строку.

df1 = df1.set_index(key_fields + df1.groupby(key_fields).cumcount())

Но это дает мне ошибку

numpy.core._exceptions._UFuncNoLoopError: ufunc 'add' did not contain a loop with signature matching types (dtype('<U10'), dtype('int64')) -> None
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Когда вы пытаетесь объединить список имен столбцов с помощью Series, это может создать неоднозначность, поскольку DataFrame.set_index напрямую не поддерживает объединение списка имен столбцов с Series.

Вы можете создать один список элементов и передать Series из GroupBy.cumcount для объединения списка имен столбцов key_fields с помощью Series:

print (df1)
  first_name last_name  val
0          a         s    1
1          a         s    2
2          f         c    8
3          f         c    7
4          f         c    3
5          g         b    2

out = df1.set_index(['first_name', 'last_name',
                     df1.groupby(['first_name', 'last_name']).cumcount()])
print (out)
                        val
first_name last_name       
a          s         0    1
                     1    2
f          c         0    8
                     1    7
                     2    3
g          b         0    2

key_fields = ['first_name', 'last_name']
out = df1.set_index(key_fields + [df1.groupby(key_fields).cumcount()])
print (out)
                        val
first_name last_name       
a          s         0    1
                     1    2
f          c         0    8
                     1    7
                     2    3
g          b         0    2


print (type(key_fields))
<class 'list'>

print (type(df1.groupby(key_fields).cumcount()))
<class 'pandas.core.series.Series'>

Некоторые объяснения помогут ОП лучше понять проблему, а не просто копировать код.

Nijat Mursali 13.08.2024 14:38
Ответ принят как подходящий

В Python вы не можете напрямую объединить list и Series таким образом. Вместо этого вам нужно правильно объединить их в функции set_index.

Вы можете попробовать:

df1 = df1.set_index(key_fields + [df1.groupby(key_fields).cumcount()])

Что касается объяснения, key_fields — это список строк: ['first_name', 'last_name']. Однако df1.groupby(key_fields).cumcount() — это серия Pandas, и вам нужно обернуть ее в list [], чтобы иметь возможность объединить ее с key_fields.

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