Добавить специфичные для категории столбцы и значения в фрейм данных - PullRequest
0 голосов
/ 26 сентября 2018

Я хочу создать столбцы для конкретной категории, основанные на соответствующей категории для некоторых из столбцов.

Я сделал это в несколько раз, (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']

Другие используемые ресурсы: вопрос1 , вопрос2

1 Ответ

0 голосов
/ 26 сентября 2018

Использование:

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  

Объяснение :

  1. Изменить на set_index с unstack
  2. Выравнивание MultiIndex в столбцах по map и join
  3. Индекс по столбцу по DataFrame.reset_index
  4. Только последнее удаление 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...