python - 仅取消堆叠或旋转某些列

标签 python pandas

给定以下数据框:

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”和“年份”,同时保持 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”匹配的记录(如果这是使用的方法)。 我的意思是,如果列的顺序不像我的示例中那样排序,它将生成相同的结果。

最佳答案

您可以通过前 3 列设置多重索引并使用 unstacklevel=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 的顺序不同,您可以使用 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

关于python - 仅取消堆叠或旋转某些列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33057946/

相关文章:

python - 在 pandas DataFrame 中创建具有特定值的列

python - 如何删除未命名的 header ?

python - Pandas GroupBy计算满足一定条件的加权百分比

python - Opencv2和python——cv2检测不同的RGB值

python - 在 R 中做 dt[,y :=myfun(x), by=list(a,b,c)] 的 pythonic 方法是什么?

python - 安排 python 脚本在 AWS 中运行

python-3.x - 如何使 pandas read_csv 处理 numpy str(或 unicode)标量数据类型

python - 在 Django 中访问查询集数据并对其执行操作

python - 如何使用 pyscript 加载 zip 文件并保存到虚拟文件系统中

python - pandas - 如果存在部分字符串匹配,则将值放入新列中