python - 基于单列的多个数据框转换
问题描述
我一直在寻找类似的问题,但我没有找到我想做的解决方案。欢迎任何帮助
所以这是获取我的 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#
我也想保留列的相应值:Time,Status,F_norm,Delta
最后创建一个新列“类型信息”,其中包含每个SD#(W/Z 或 A/B 等)的特定字符串,所有这一切都通过保留我的主 data_frame 的索引!
这是期望的结果:
我希望我足够清楚,等待你的回报谢谢。
解决方案
利用:
#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
推荐阅读
- php - 从 php 扩展调用 compact() 到 C++
- observable - 调度程序时钟绝对时间的 Rx.net 缓冲区
- android - Android 后台服务,如果设备处于唤醒状态,则每 10 秒安排一次任务的最佳方式
- python - Python 3-如何将一个字典中的键与另一个字典进行比较,添加它们的值,将结果存储在第一个字典的值中?
- node.js - 注册 ServiceWorker 失败:脚本具有不受支持的 MIME 类型 ('text/html')
- swift - UICollectionViewCell 重复
- android - Fill Polygon with icons
- javascript - 查询字符串变量自动添加到 url
- c# - 向数据库插入数据时出错
- linux - 我刚刚下载了ubuntu,但是我无法将目录更改为“/ C”或类似的