首页 > 解决方案 > 基于单列的多个数据框转换

问题描述

我一直在寻找类似的问题,但我没有找到我想做的解决方案。欢迎任何帮助

所以这是获取我的 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'])

输出 :

在此处输入图像描述

我想根据“信息”列为我的主数据框中的每一行创建两个新行

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

我也想保留列的相应值:TimeStatusF_normDelta

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

这是期望的结果:

在此处输入图像描述

我希望我足够清楚,等待你的回报谢谢。

标签: pythonregexpandasdataframe

解决方案


利用:

#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

推荐阅读