Объединение нескольких имен столбцов с одинаковой начальной фразой в одно имя столбца - PullRequest
0 голосов
/ 03 августа 2020

У меня есть образец фрейма данных из файла excel, как показано ниже:

d = {"Id":[1,2],
     "Freight charge - 694.5 KG @ USD 0.68/KG":[340,0],
"Terminal Handling Charges":[0,0],  
"IOR FEE":[0,0],
"Handling - 694.5 KG @ USD 0.50/KG":[357,0],
"Delivery Cartage - 694.5 KG @ USD 0.25/KG":[0,0],
"Fuel Surcharge - 694.5 KG @ USD 0.25/KG":[346,0],
"War Risk Surcharge - 694.5 KG @ USD 0.14/KG":[0,0],
"Freight charge - 97.5 KG @ USD 1.30/KG":[0,124],
"Airway Bill Fee":[0,0],
"Handling":[0,0],
"Terminal Handling Charges - 97.5 KG @ USD 0.18/KG":[0,34],
"Delivery Cartage- White glove service":[0,20]
       }

df = pd.DataFrame.from_dict(d)

Я поставил 0, но на самом деле это будет NA.

Выглядит как фрейм данных ниже

введите описание изображения здесь

Я хочу объединить все столбцы, которые начинаются с определенной фразы, в один столбец, и значение для этого должно быть в отдельных строках. Например, у меня есть столбцы выше с "Freight Charge-". Я хочу сделать их как один столбец «Freight Charge», и значения, которые имеют эти столбцы, должны быть частью этого столбца как значения. Я хочу сделать то же самое для других столбцов, у которых такая же начальная фраза, как

'Delivery Cartage', должна быть названа как «Стоимость доставки» или где-либо, где у меня есть «обработка» как «Стоимость обработки».

Хотите что-то вроде ниже:

ID  Freight Charges     Handling    Fuel Surcharge  Delivery Charges
1   340 357 346 NA 
2   124 NA  NA  20

Я добавил только образцы имен столбцов. Пожалуйста, ожидайте, что столбцы с одинаковой начальной фразой (например, фрахтовые сборы) больше двух с другим конечным текстом. Так что нужен общий c sols, которые могут взять столько имен столбцов с одинаковой начальной фразой и преобразовать их в одно имя столбца

Ответы [ 2 ]

1 голос
/ 03 августа 2020

import numpy as np

Замените 0 на NaN. Отбросьте столбцы с менее чем 1 не NaN. Разделите столбцы специальным символом - и возьмите строку index 0. Наконец, объедините столбцы с тем же именем

df2=df.replace(0,np.nan).dropna(thresh=1, axis='columns')
df2.columns=df2.columns.str.split('([-])').str[0]
df2.groupby(lambda x:x, axis=1).sum()

Укороченная версия

df.columns=df.columns.str.split('([-])').str[0]
df.replace(0,np.nan).dropna(thresh=1, axis='columns').groupby(lambda x:x, axis=1).sum()

 Delivery Cartage  Freight charge   Fuel Surcharge   Handling    Id  \
0               0.0            340.0            346.0      357.0  1.0   
1              20.0            124.0              0.0        0.0  2.0   

   Terminal Handling Charges   
0                         0.0  
1                        34.0  
1 голос
/ 03 августа 2020

Вы можете фильтровать столбцы, как показано ниже (также, последняя строка сохраняет имена столбцов по порядку)

def colname(c):
  if 'freight charge' in c.lower():
    return 'Freight Charge'
  elif  'delivery cartage' in c.lower():
    return 'Delivery Charges'
  elif  'handling' in c.lower():
    return 'Handling charges'
  else:
    return c    
cols = [colname(col) for col in df.columns]
df.columns = cols 
#preserve the last order of the columns
old_cols  = df.columns.unique().values

, и вы можете комбинировать значения как

df= df.groupby(lambda x:x, axis=1).sum()

Обновление : изменить порядок столбцов, как раньше

df = df[list(old_cols)]

Вот ожидаемый результат

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...