У меня есть датафрейм. `
data = pd.DataFrame([['Benz', 'MinSpeed', 0, np.nan, 'USA', '2022-08-12'],
['Benz', 'TopSpeed', 200, np.nan, 'USA', '2022-08-12'],
['Benz', 'ChasisNum', 654121, np.nan, 'USA', '2022-08-12'],
['Benz', 'Seats', 5, np.nan, 'USA', '2022-08-12'],
['Benz', 'AirBags', 5, np.nan, 'USA', '2022-08-12'],
['Benz', 'VehicleType', np.nan, 'Sedan', 'USA', '2022-08-12'],
['Benz', 'Color', np.nan, 'Black','USA', '2022-08-12'],
['Benz', 'InternetInside', np.nan, 'Yes','USA', '2022-08-12'],
['Ferrari', 'MinSpeed', 0, np.nan, 'France', '2022-12-25'],
['Ferrari', 'TopSpeed', 250, np.nan, 'France', '2022-12-25'],
['Ferrari', 'ChasisNum', 781121, np.nan, 'France', '2022-12-25'],
['Ferrari', 'Seats', 4, np.nan, 'France', '2022-12-25'],
['Ferrari', 'AirBags', 2, np.nan, 'France', '2022-12-25'],
['Ferrari', 'VehicleType', np.nan, 'SUV', 'France', '2022-12-25'],
['Ferrari', 'Color', np.nan, 'Red','France', '2022-12-25'],
['Ferrari', 'InternetInside', np.nan, 'No','France', '2022-12-25'],
],
columns= ['CarModel', 'Features', 'NumericalValues', 'CategoricalValues','Country', 'DeliveryDate'])
`
Я пытаюсь повернуть данные с помощью функции поворота, но получаю повторяющиеся столбцы для значений «Числовые значения» и «Категорные значения».
Код: `
data.pivot(index='CarModel', columns='Features', values=['NumericalValues','CategoricalValues' ]).reset_index()
`
Мне нужен ожидаемый результат как: `
output_data = pd.DataFrame([['Benz', 0, 200, 654121, 5, 5, 'Sedan', 'Black', 'Yes', 'USA', '2022-08-12'],
['Ferrari', 0, 250, 781121, 4, 2, 'SUV', 'Red', 'No', 'France', '2022-12-25']
],
columns=['CarModel', 'MinSpeed', 'TopSpeed', 'ChasisNum','Seats', 'AirBags', 'VehicleType', 'Color', 'InternetInside', 'Country', 'DeliveryDate'])
` Я также пытался использовать сводную таблицу, но не смог получить этот результат.
Из ваших данных, поскольку у вас есть значение либо в «Числовых значениях», либо в «Категорных значениях», вы можете создать столбец, который объединяет всю информацию из обоих столбцов с fillna
, а затем использовать pivot
, как вы это делали.
res = (
data.assign(Values=lambda x: x['NumericalValues'].fillna(x['CategoricalValues']))
.pivot(index='CarModel', columns='Features', values='Values')
.reset_index().rename_axis(columns=None)
)
print(res)
# CarModel AirBags ChasisNum Color InternetInside MinSpeed Seats TopSpeed \
# 0 Benz 5.0 654121.0 Black Yes 0.0 5.0 200.0
# 1 Ferrari 2.0 781121.0 Red No 0.0 4.0 250.0
# VehicleType
# 0 Sedan
# 1 SUV
@mozway ну цепочка с .convert_dtypes()
должна это исправить :)
Спасибо @Ben.T за решение, и у нас есть обходной путь для изменения dtypes. Таким образом, это абсолютно нормальное и менее трудоемкое решение.
Вы можете выполнить pivot
, а затем запустить groupby.first для столбцов, чтобы избавиться от ненужных столбцов:
out = (data
.pivot(index=['CarModel', 'Country', 'DeliveryDate'],
columns='Features'
)
.groupby(level='Features', axis=1).first()
.reset_index()
)
Выход:
Features CarModel Country DeliveryDate AirBags ChasisNum Color InternetInside MinSpeed Seats TopSpeed VehicleType
0 Benz USA 2022-08-12 5.0 654121.0 Black Yes 0.0 5.0 200.0 Sedan
1 Ferrari France 2022-12-25 2.0 781121.0 Red No 0.0 4.0 250.0 SUV
Преимущество в том, что он поддерживает dtypes:
Features
CarModel object
Country object
DeliveryDate object
AirBags float64
ChasisNum float64
Color object
InternetInside object
MinSpeed float64
Seats float64
TopSpeed float64
VehicleType object
dtype: object
Другое возможное решение с использованием pandas.pivot_table:
out = (data.pivot_table(
index=['CarModel', 'Country', 'DeliveryDate'],
columns='Features', values=['NumericalValues', 'CategoricalValues'],
aggfunc=max)
.droplevel(0, axis=1)
.rename_axis(None, axis=1)
.reset_index())
Выход:
CarModel Country DeliveryDate Color InternetInside VehicleType AirBags \
0 Benz USA 2022-08-12 Black Yes Sedan 5.0
1 Ferrari France 2022-12-25 Red No SUV 2.0
ChasisNum MinSpeed Seats TopSpeed
0 654121.0 0.0 5.0 200.0
1 781121.0 0.0 4.0 250.0
типы:
CarModel object
Country object
DeliveryDate object
Color object
InternetInside object
VehicleType object
AirBags float64
ChasisNum float64
MinSpeed float64
Seats float64
TopSpeed float64
Это простой обходной путь (это была моя первоначальная идея), но плохой недостаток в том, что он объединяет dtypes, и все станет
object