reshape df 的最佳方式是什么,以便它根据列名的相似性堆叠列,同时在新列中保留列名的唯一 ID 部分?
我有一个类似于下面的df(我的实际数据还包括需要保留的NaN值):
df = pandas.DataFrame({"RX_9mm": scipy.randn(5), "RY_9mm": scipy.randn(5),"TX_9mm": scipy.randn(5), "TY_9mm": scipy.randn(5), "RX_10mm": scipy.randn(5), "RY_10mm": scipy.randn(5),"TX_10mm": scipy.randn(5), "TY_10mm": scipy.randn(5), "time": range(5)})
RX_9mm RY_9mm TX_9mm TY_9mm RX_10mm RY_10mm TX_10mm TY_10mm time
0 -0.1444 2.1319 1.9665 0.1773 0.5156 -1.8461 0.9122 1.1285 0
1 1.4831 -0.8773 -1.0112 -0.0010 1.4532 -1.3721 0.6894 -0.1781 1
2 0.3685 0.2148 -1.2216 0.0098 -1.1427 -0.1851 0.3890 0.9552 2
3 0.6843 -2.0279 -1.1342 -0.8869 0.2718 -2.4857 -1.0496 -0.4286 3
4 -1.5625 -0.2733 -0.1243 -1.2248 -0.7403 -0.5840 0.1797 -0.7014 4
但是我需要它看起来像这样:
RX RY TX TY time ID
0 -0.1444 2.1319 1.9665 0.1773 0 9mm
1 1.4831 -0.8773 -1.0112 -0.0010 1 9mm
2 0.3685 0.2148 -1.2216 0.0098 2 9mm
3 0.6843 -2.0279 -1.1342 -0.8869 3 9mm
4 -1.5625 -0.2733 -0.1243 -1.2248 4 9mm
5 0.5156 -1.8461 0.9122 1.1285 0 10mm
6 1.4532 -1.3721 0.6894 -0.1781 1 10mm
7 -1.1427 -0.1851 0.3890 0.9552 2 10mm
8 0.2718 -2.4857 -1.0496 -0.4286 3 10mm
9 -0.7403 -0.5840 0.1797 -0.7014 4 10mm
我尝试使用 Chang She 的“Reshaping dataframes in pandas based on column labels”示例中的以下代码
但是当我使用下面的代码时:
id = df.ix[:, ['time']]
df.columns = pandas.MultiIndex.from_tuples([tuple(c.split('_')) for c in df.columns])
pandas.merge(df.stack(0).reset_index(1), id, left_index=True, right_index=True)
我得到:
RX RY TX TY RX RY TX TY time
9mm 9mm 9mm 9mm 10mm 10mm 10mm 10mm NaN
0 -0.1444 2.1319 1.9665 0.1773 0.5156 -1.8461 0.9122 1.1285 0
1 1.4831 -0.8773 -1.0112 -0.0010 1.4532 -1.3721 0.6894 -0.1781 1
2 0.3685 0.2148 -1.2216 0.0098 -1.1427 -0.1851 0.3890 0.9552 2
3 0.6843 -2.0279 -1.1342 -0.8869 0.2718 -2.4857 -1.0496 -0.4286 3
4 -1.5625 -0.2733 -0.1243 -1.2248 -0.7403 -0.5840 0.1797 -0.7014 4
我知道新列是多级的,具有测量(RX、RY 等)和 ID(9 毫米、10 毫米)级别,但我不明白如何将测量堆叠到同一列中同时保持ID 作为新列。
如果有人能解释我在获取此输出而不是堆叠列方面做错了什么,我将不胜感激。
谢谢
最佳答案
您可以简化您的解决方案,最后一个merge 不是必需的,因为由set_index 将列time 转换为index第一步:
df = df.set_index('time')
#expand=True in columns create MultiIndex
df.columns = df.columns.str.split('_', expand=True)
#rename_axis set MultiIndex names for names of columns after reset index
df = df.stack(dropna=False).rename_axis(['time','ID']).reset_index()
print (df)
time ID RX RY TX TY
0 0 10mm -0.549487 -0.349412 -0.620500 0.992223
1 0 9mm 0.831292 -2.465550 -0.863001 -1.335898
2 1 10mm 0.214057 -0.136649 1.831669 -0.672306
3 1 9mm -0.372416 -1.633798 -0.414518 -1.426492
4 2 10mm 0.480018 1.575599 -1.330841 -0.780036
5 2 9mm 0.352044 -1.008269 1.339841 0.423539
6 3 10mm -0.822354 0.002455 -1.099829 0.060929
7 3 9mm 1.336161 -0.066224 -1.111453 1.651180
8 4 10mm 0.627119 -0.419848 1.052179 -0.426928
9 4 9mm 0.701500 -0.833526 2.563398 0.749432
如果想要更改列的排序是可能的,请使用 numpy.r_ :
df = df[np.r_[df.columns[2:], df.columns[:2]]]
print (df)
RX RY TX TY time ID
0 -0.549487 -0.349412 -0.620500 0.992223 0 10mm
1 0.831292 -2.465550 -0.863001 -1.335898 0 9mm
2 0.214057 -0.136649 1.831669 -0.672306 1 10mm
3 -0.372416 -1.633798 -0.414518 -1.426492 1 9mm
4 0.480018 1.575599 -1.330841 -0.780036 2 10mm
5 0.352044 -1.008269 1.339841 0.423539 2 9mm
6 -0.822354 0.002455 -1.099829 0.060929 3 10mm
7 1.336161 -0.066224 -1.111453 1.651180 3 9mm
8 0.627119 -0.419848 1.052179 -0.426928 4 10mm
9 0.701500 -0.833526 2.563398 0.749432 4 9mm
关于基于保留 ID 和其他行的列名的 Python reshape ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52515233/
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration
我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源
capybara找不到在我的cucumber测试中用它的id标记。当我save_and_open_page时,我能够看到该元素.但我无法通过has_css?找到它或find:pry(#)>page.html.scan(/notice_sent/).count=>1pry(#)>page.html.scan(/id=\"notice_sent\"/).count=>1pry(#)>page.find('#notice_sent')Capybara::ElementNotFound:Unabletofindcss"#notice_sent"from/Users/me/.gem/ruby/2