基于单个列的多个数据框转换

时间:2019-03-01 14:36:53

标签: python regex pandas 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

我想基于'信息'

在主数据框中为每行创建两个新行

我们在主数据框中的“信息” 列中看到,每一行包含两个不同的 SD# 我只希望每行只有一个 SD#

我还要保留列的相应值:时间状态 F_norm 增量 >

最后创建一个新列“类型信息” ,其中包含每个 SD#(W / Z或A / B等)的特定字符串,并通过保持我的主要data_frame的索引!

这是所需的结果:

enter image description here

我希望我足够清楚,等待您的退货,谢谢。

1 个答案:

答案 0 :(得分:4)

使用:

#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