Я ищу для создания столбцов категории, основанных на соответствующей категории для некоторых столбцов.
Я выполнил это раундом: (1) разрезая две категории на два отдельных кадра данных, (2) слияние двух данных в дату (3) удаление избыточных столбцов (4) создание новых столбцов (категория агностик) (4) удалить столбцы определенной категории. Знаете ли вы более эффективный способ сделать это преобразование? Мой код ниже примера ввода/вывода
Входные данные:
wk start car rims color Autopilot$ Sunroof$
0 2018-09-09 tesla model x 17 black 3000 0
1 2018-09-16 tesla model x 14 yellow 3000 0
2 2018-09-23 tesla model x 13 white 3000 0
3 2018-09-09 tesla model 3 19 grey 0 2000
4 2018-09-16 tesla model 3 21 pink 0 2000
Идеальный выход:
wk rims-mod3 rims-modx color-mod3 color-modx Auto$ roof$
0 2018-09-09 17 0 black grey 3000 2000
1 2018-09-16 14 19 yellow pink 3000 2000
2 2018-09-23 13 21 white NaN 3000 0
Мой код:
import pandas as pd
df = pd.DataFrame({'wk start': ['2018-09-09', '2018-09-16', '2018-09-23','2018-09-09', '2018-09-16'],
'car': [ 'tesla model x', 'tesla model x', 'tesla model x','tesla model 3','tesla model 3'],
'rims': [17,14,13,19,21],
'color':['black','yellow','white','grey','pink'],
'Autopilot$':[3000,3000, 3000,0,0],
'Sunroof$':[0,0,0,2000,2000]})
model3 = df[df['car']=='tesla model 3']
modelx = df[df['car']=='tesla model x']
example = model3.merge(modelx, how='outer',left_on='wk start',right_on='wk start',suffixes=('_model3', '_modelx'))
del example['car_model3']
del example['car_modelx']
example['AUTOPILOT']=example['Autopilot$_model3']+example['Autopilot$_modelx']
example['SUNROOF']=example['Sunroof$_model3']+example['Sunroof$_modelx']
del example['Autopilot$_model3']
del example['Autopilot$_modelx']
del example['Sunroof$_modelx']
del example['Sunroof$_model3']
Использование:
df = df.set_index(['wk start','car']).unstack()
df.columns = df.columns.map('_'.join)
df = df.reset_index()
df = df.loc[:, df.fillna(0).ne(0).any()]
print (df)
wk start rims_tesla model 3 rims_tesla model x color_tesla model 3 \
0 2018-09-09 19.0 17.0 grey
1 2018-09-16 21.0 14.0 pink
2 2018-09-23 NaN 13.0 NaN
color_tesla model x Autopilot$_tesla model x Sunroof$_tesla model 3
0 black 3000.0 2000.0
1 yellow 3000.0 2000.0
2 white 3000.0 NaN
Объяснение:
set_index
с помощью set_index
с unstack
map
и join
DataFrame.reset_index
0
столбцов с помощью boolean indexing
с loc
РЕДАКТИРОВАТЬ:
вы можете объяснить эту строку немного df.loc [:, df.fillna(0).ne(0).any()]? Я не могу понять, что он делает? Не существует никаких значений nan.
Если использование unstack
тогда возможно, некоторые недостающие значения, как в этом примере:
print (df)
wk start rims_tesla model 3 rims_tesla model x color_tesla model 3 \
0 2018-09-09 19.0 17.0 grey
1 2018-09-16 21.0 14.0 pink
2 2018-09-23 NaN 13.0 NaN
color_tesla model x Autopilot$_tesla model 3 Autopilot$_tesla model x \
0 black 0.0 3000.0
1 yellow 0.0 3000.0
2 white NaN 3000.0
Sunroof$_tesla model 3 Sunroof$_tesla model x
0 2000.0 0.0
1 2000.0 0.0
2 NaN 0.0
Так что нужно возвращать значения True для столбцов, которые не содержат все нулевые или все ноль с NaN (что является причиной использования fillna(0)
):
print (df.fillna(0).ne(0))
wk start rims_tesla model 3 rims_tesla model x color_tesla model 3 \
0 True True True True
1 True True True True
2 True False True False
color_tesla model x Autopilot$_tesla model 3 Autopilot$_tesla model x \
0 True False True
1 True False True
2 True False True
Sunroof$_tesla model 3 Sunroof$_tesla model x
0 True False
1 True False
2 False False
Убедитесь, что хотя бы один True с any
:
print (df.fillna(0).ne(0).any())
wk start True
rims_tesla model 3 True
rims_tesla model x True
color_tesla model 3 True
color_tesla model x True
Autopilot$_tesla model 3 False
Autopilot$_tesla model x True
Sunroof$_tesla model 3 True
Sunroof$_tesla model x False
dtype: bool
df.loc[:, df.fillna(0).ne(0).any()]
? Я не могу понять, что это делает? Там нет никаких значенийnan
.