Я пытаюсь вычислить уникальные значения в столбце кадра данных pandas, сгруппированного вторым столбцом, и вернуть результаты в виде нового столбца в кадре данных.
Когда я тестирую эту операцию на следующем кадре данных, она возвращает нулевые значения.
df = pd.DataFrame([('bird', 'Falconiformes', 389.0), ('bird', 'Psittaciformes', 24.0), ('mammal', 'Carnivora', 80.2), ('mammal', 'Primates', np.nan), ('mammal', 'Carnivora', 58)], index=['falcon', 'parrot', 'lion', 'monkey', 'leopard'],columns=('class', 'order', 'max_speed'))
В пандах 0.18 я использовал
df['test'] = df.groupby('class').transform('unique')
Traceback (most recent call last):
File "<ipython-input-146-283294ac8bef>", line 1, in <module>
df['test'] = df.groupby('class').transform('unique')
File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\groupby\generic.py", line 1469, in transform
raise ValueError(msg)
ValueError: 'unique' is not a valid function name for transform(name)
но мой администратор недавно обновил pandas и unique больше не является допустимой функцией для преобразования. Существует ветка, предлагающая подать заявку на pandas 1.1.3 (см. обсуждение). Я просмотрел новую документацию для 1.1.3 и попытался использовать следующие
df['test']=df.groupby('class').apply(lambda x: x['max_speed'].unique())
df
Out[135]:
index class order max_speed test
0 falcon bird Falconiformes 389.0 NaN
1 parrot bird Psittaciformes 24.0 NaN
2 lion mammal Carnivora 80.2 NaN
3 monkey mammal Primates NaN NaN
4 leopard mammal Carnivora 58.0 NaN
но применить не расширяет значение на другие строки, хотя
df.groupby('class').apply(lambda x: x['max_speed'].unique())
Out[140]:
class
bird [389.0, 24.0]
mammal [80.2, nan, 58.0]
dtype: object
Если я попытаюсь добавить ключевые слова, упомянутые в последнем применить документацию Я получаю сообщение об ошибке.
df['test']=df.groupby('class').apply(lambda x: x['max_speed'].unique(), result_type='expand')
Traceback (most recent call last):
File "<ipython-input-145-9b84754c6daf>", line 1, in <module>
df['test']=df.groupby('class').apply(lambda x: x['max_speed'].unique(), result_type='expand')
File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 870, in apply
return self._python_apply_general(f, self._selected_obj)
File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 892, in _python_apply_general
keys, values, mutated = self.grouper.apply(f, data, self.axis)
File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\groupby\ops.py", line 213, in apply
res = f(group)
File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 843, in f
return func(g, *args, **kwargs)
TypeError: <lambda>() got an unexpected keyword argument 'result_type'
Я знаю, что могу использовать groupby с агрегатом и уникальной функцией и снова объединить полученный фрейм данных. Но мне нужно выполнить эту операцию для нескольких разных группировок, и я бы предпочел однострочный ответ.