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

1

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

Я выполнил это раундом: (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

Теги:
pandas
dataframe

1 ответ

3
Лучший ответ

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

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 с помощью 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
  • 2
    Jezrael, можете ли вы объяснить эту строку немного df.loc[:, df.fillna(0).ne(0).any()] ? Я не могу понять, что это делает? Там нет никаких значений nan .
  • 2
    @SaiKumar - хороший вопрос, отредактированный ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню