Несколько преобразований данных на основе одного столбца - PullRequest
0 голосов
/ 01 марта 2019

Я искал похожий вопрос, но не нашел решения для того, что я хочу сделать.любая помощь приветствуется

, поэтому вот код для получения примера моего Dataframe:

import pandas as pd
L = [[0.1998,'IN TIME,IN TIME','19708,19708','MR SD#5 W/Z SD#6 X/Y',20.5],
     [0.3983,'LATE,IN TIME','11206,18054','MR SD#4 A/B SD#1 C/D',19.97]]

df = pd.DataFrame(L,columns=['Time','status','F_nom','info','Delta'])

вывод:

enter image description here

Я хотел бы создать две новые строки для каждой строки в моем основном кадре данных на основе 'Info' столбец

, как мы видим в столбце 'Info' в моем основном фрейме данных каждая строка содержит два разных SD # , я хотел бы иметь только один SD # на строку

Также я хотел бы сохранитьсоответствующие значения столбцов: Время , Статус , F_norm , Дельта

Окончательно создать новый столбец 'type info' , которая содержит определенную строку для каждого SD # (W / Z или A / B и т. Д.) И все это, сохраняя индекс моего основного data_frame!

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

enter image description here

Надеюсь, я был достаточно ясен, ожидая вашего возвращения, спасибо.

1 Ответ

0 голосов
/ 01 марта 2019

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

#split values by comma or whitespace
df['status'] = df['status'].str.split(',')
df['F_nom'] = df['F_nom'].str.split(',')
info = df.pop('info').str.split()
#select values by indexing
df['info'] = info.str[1::2]
df['type_info'] = info.str[2::2]

#reshape to Series
s = df.set_index(['Time','Delta']).stack()
#create new DataFrame and reshape to expected output
df1 = (pd.DataFrame(s.values.tolist(), index=s.index)
        .stack()
        .unstack(2)
        .reset_index(level=2, drop=True)
        .reset_index())
print (df1)
     Time  Delta   status  F_nom  info type_info
0  0.1998  20.50  IN TIME  19708  SD#5       W/Z
1  0.1998  20.50  IN TIME  19708  SD#6       X/Y
2  0.3983  19.97     LATE  11206  SD#4       A/B
3  0.3983  19.97  IN TIME  18054  SD#1       C/D

Другое решение:

df['status'] = df['status'].str.split(',')
df['F_nom'] = df['F_nom'].str.split(',')
info = df.pop('info').str.split()
df['info'] = info.str[1::2]
df['type_info'] = info.str[2::2]

from itertools import chain

lens = df['status'].str.len()
df = pd.DataFrame({
    'Time' : df['Time'].values.repeat(lens), 
    'status' : list(chain.from_iterable(df['status'].tolist())), 
    'F_nom' : list(chain.from_iterable(df['F_nom'].tolist())), 
    'info' : list(chain.from_iterable(df['info'].tolist())), 
    'Delta' : df['Delta'].values.repeat(lens),
    'type_info' : list(chain.from_iterable(df['type_info'].tolist())), 
})
print (df)
     Time   status  F_nom  info  Delta type_info
0  0.1998  IN TIME  19708  SD#5  20.50       W/Z
1  0.1998  IN TIME  19708  SD#6  20.50       X/Y
2  0.3983     LATE  11206  SD#4  19.97       A/B
3  0.3983  IN TIME  18054  SD#1  19.97       C/D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...