当前位置: 首页 > 知识库问答 >
问题:

仅取消堆叠或旋转某些列

罗源
2023-03-14

给定以下数据帧:

import pandas as pd
DF = pd.DataFrame({'COL1': ['A', 'A', 'A', 'B','B','B'], 
                   'COL2' : [1,2,3,1,2,3],
                   'COL3': [11032, 1960, 11400, 11355, 8, 7], 
                   'year': ['2016', '2017', '2018', '2019', '2020', '2021']})
DF

        COL1 COL2 COL3  COL4    year
     0    A   1   2    11032    2016
     1    A   2   2    1960     2017
     2    A   3   4    11400    2018
     3    B   1   2    11355    2019
     4    B   2   2    8        2020
     5    B   3   4    7        2021

我只想通过COL1来解开“COL4”和“Year”,同时保持COL2和COL3的机智。最终结果应如下所示:

    COL2    COL3    COL4 (A)    year (A)    COL4 (B)    year (B)
0      1     2     11032       2016         11355       2019
1      2     2     1960        2017         8           2020
2      3     4     11400       2018         7           2021

另外,如果在“COL1”下有一些记录没有“A”怎么办?

我假设解压时,解决方案将在COL2和COL3上查找匹配的记录(如果使用的是这种方法)。我的意思是,如果列的顺序没有像我的例子中那样排序,它将生成相同的结果。

谢谢

共有1个答案

程皓轩
2023-03-14

您可以按前3列设置多索引,并使用unstack和level=0
然后,您可以重命名列名称,也可以按级别标签或自定义名称重命名列名称。

#  COL1  COL2  COL3   COL4  year
#0    A     1     2  11032  2016
#1    A     2     2   1960  2017
#2    A     3     4  11400  2018
#3    B     1     2  11355  2019
#4    B     2     2      8  2020
#5    B     3     4      7  2021

DF = DF.set_index(['COL1', 'COL2', 'COL3'])
DF = DF.unstack(0).reset_index()
print DF
#     COL2 COL3   COL4         year
#COL1                A      B     A     B
#0       1    2  11032  11355  2016  2019
#1       2    2   1960      8  2017  2020
#2       3    4  11400      7  2018  2021

levels = DF.columns.levels
labels = DF.columns.labels
DF.columns = levels[0][labels[0]]
print DF
#   COL2  COL3   COL4   COL4  year  year
#0     1     2  11032  11355  2016  2019
#1     2     2   1960      8  2017  2020
#2     3     4  11400      7  2018  2021
DF.columns = ['COL2','COL3','COL4','COL5','COL6','COL7']
print DF
#   COL2  COL3   COL4   COL5  COL6  COL7
#0     1     2  11032  11355  2016  2019
#1     2     2   1960      8  2017  2020
#2     3     4  11400      7  2018  2021

但是如果列COL2COL3的顺序不同,您可以使用Andy Hayden的little hack:

#  COL1  COL2  COL3   COL4  year
#0    A     4     6  11032  2016
#1    A     9     2   1960  2017
#2    A     8     4  11400  2018
#3    B     4     6  11355  2019
#4    B     9     2      8  2020
#5    B     8     4      7  2021
DF = DF.set_index(['COL1', 'COL2', 'COL3'])

index = pd.MultiIndex(levels=[DF.index.get_level_values(1).unique(),
                   DF.index.get_level_values(2).unique()],
                   labels=[[0, 1, 2],
                   [0, 1, 2]])
DF = DF.unstack(0)
DF = DF.reindex(index).reset_index()
print DF
#     level_0 level_1   COL4         year
#COL1                      A      B     A     B
#0          4       6  11032  11355  2016  2019
#1          9       2   1960      8  2017  2020
#2          8       4  11400      7  2018  2021
levels = DF.columns.levels
labels = DF.columns.labels
DF.columns = levels[0][labels[0]]
print DF
#   level_0  level_1   COL4   COL4  year  year
#0        4        6  11032  11355  2016  2019
#1        9        2   1960      8  2017  2020
#2        8        4  11400      7  2018  2021
DF.columns = ['COL2','COL3','COL4','COL5','COL6','COL7']
print DF
#   COL2  COL3   COL4   COL5  COL6  COL7
#0     4     6  11032  11355  2016  2019
#1     9     2   1960      8  2017  2020
#2     8     4  11400      7  2018  2021
 类似资料:
  • 我们有一个Kafka制作人,偶尔会制作一些信息。 我写了一个消费者来消费这些消息。问题是,只有当两个消息叠加时,它们才会被使用。例如,如果消息是在13:00产生的,消费者不做任何事情。如果另一条消息是在13:01生成的,则消费者会使用这两条消息。在kafkaTool中,在消费者属性中有一个名为LAG的列,当消息未被消费时,该列为1。我缺少的这个东西有什么配置吗? 消费者配置:

  • 问题内容: 我正在尝试在数据库中进行几行的mysql转储。然后,我可以使用转储将那几行上载到另一个数据库中。我拥有的代码正在运行,但是它会转储所有内容。我怎样才能使mysqldump只转储表的某些行? 这是我的代码: 问题答案: 只需解决您的选择。它应该是有效的SQL WHERE子句,例如: 您将列名放在引号之外。

  • 问题内容: 如果我有一些代码,例如 并且输入文件包含成对的行,我该如何做,以便仅导入每行的第一行?因此,换句话说,每条奇数行都只有?谢谢 问题答案: 您可能想考虑使用来简化奇数行()的过滤。或者在另一种方法中,如果您使用的是JDK7,则可以使用该方法,并在迭代时再次过滤奇数。

  • 你好,我看到的日志信息只在某些类,不知道在哪里看。是我的原木模式搞错了还是?这是我的log4j配置,我将它与sfl4j一起使用: null 我创建的记录器是这样的,类字段: 和日志记录,如: 有什么想法吗? 更新 根据Petar Minchev的回答改为信息,但我仍然没有得到任何东西。 更新II 现在,在添加了一些依赖项之后,它可以在一些类上工作(仍然不能在其他一些类上工作)。有一些实现runna

  • 我使用intern.js和硒网格来测试我的应用程序web,当我在节点机器(MAC)上运行Chrome测试时,我得到这个错误: 您正在使用不支持的命令行标志-忽略-证书-错误稳定性和安全性将受到影响

  • 问题内容: 我想找出悬停时如何制作 旋转或旋转的图像 。我想知道如何在以下代码上使用 CSS 模仿该功能: 问题答案: 您可以将CSS3过渡与一起使用,以 在悬停时旋转图像 。 旋转图像: