У меня есть такой список
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
Когда вы пытаетесь объединить список имен столбцов с помощью 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'>
В 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
.
Некоторые объяснения помогут ОП лучше понять проблему, а не просто копировать код.