Мое предложение - выйти из pandas, выполнить вычисления и вернуть результат обратно в фрейм данных. на мой взгляд, манипулировать намного проще, и я бы хотел верить быстрее:
from itertools import chain
Шаг 1: преобразовать в dict:
M = df.to_dict('records')
Шаг 2: составьте список и разделите значения:
res = [[(key,*value.split('/'))
for key,value in d.items()]
for d in M]
Шаг 3: найдите длину самого длинного ряда. Это необходимо для обеспечения одинаковой длины всех строк:
longest = max(len(line) for line in chain(*res))
print(longest)
#3
Шаг 4: самая длинная запись - 3; нам нужно убедиться, что строки меньше 3 скорректированы:
explode = [[(entry[0], entry[-1], entry[-1])
if len(entry) < longest else entry for entry in box]
for box in res]
print(explode)
[[('fuel', 'ethanol', 'gas'),
('cert_region', 'FC', 'FC'),
('veh_class', 'SUV', 'SUV'),
('air_pollution', '6', '8'),
('city_mpg', '9', '14'),
('hwy_mpg', '15', '20'),
('cmb_mpg', '1', '16'),
('smartway', 'yes', 'yes')],
[('fuel', 'ethanol', 'gas'),
('cert_region', 'FC', 'FC'),
('veh_class', 'SUV', 'SUV'),
('air_pollution', '6', '3'),
('city_mpg', '1', '14'),
('hwy_mpg', '14', '19'),
('cmb_mpg', '10', '16'),
('smartway', 'no', 'no')]]
Шаг 4. Теперь мы можем связать ключи с соответствующими значениями, чтобы получить словарь:
result = {start[0] :(*start[1:],*end[1:])
for start,end in zip(*explode)}
print(result)
{'fuel': ('ethanol', 'gas', 'ethanol', 'gas'),
'cert_region': ('FC', 'FC', 'FC', 'FC'),
'veh_class': ('SUV', 'SUV', 'SUV', 'SUV'),
'air_pollution': ('6', '8', '6', '3'),
'city_mpg': ('9', '14', '1', '14'),
'hwy_mpg': ('15', '20', '14', '19'),
'cmb_mpg': ('1', '16', '10', '16'),
'smartway': ('yes', 'yes', 'no', 'no')}
Считать результат в фрейм данных:
pd.DataFrame(result)
fuel cert_region veh_class air_pollution city_mpg hwy_mpg cmb_mpg smartway
0 ethanol FC SUV 6 9 15 1 yes
1 gas FC SUV 8 14 20 16 yes
2 ethanol FC SUV 6 1 14 10 no
3 gas FC SUV 3 14 19 16 no