草庐IT

基于保留 ID 和其他行的列名的 Python reshape

coder 2023-08-19 原文

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/

有关基于保留 ID 和其他行的列名的 Python reshape的更多相关文章

  1. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用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时

  2. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  3. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

    我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

  4. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  5. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  6. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  7. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/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

  8. ruby - Rails -- :id attribute? 所需的数据库索引 - 2

    因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration

  9. ruby-on-rails - (Ruby,Rails) 基于角色的身份验证和用户管理...? - 2

    我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源

  10. ruby - capybara 无法通过 id 找到元素 - 2

    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

随机推荐