【问题标题】:Multi-column or block melt and then pivot?多柱或块熔化然后枢转?
【发布时间】:2019-02-16 05:21:54
【问题描述】:

我正在努力解决数据重塑问题。我有大约这样的数据(但最多 C10 组,我自己添加了一个多索引。

df = pd.DataFrame({('C0',0) : {0:'ID1', 1:'ID2', 2:'ID3'},
               ('C0',1) : {0:'ID1', 1:'ID2', 2:'ID3'},
               ('C1',2) : {0:'A'  , 1:'A'  , 2:'A'},
               ('C1',3) : {0:'B'  , 1:'B'  , 2:'B'},
               ('C1',4) : {0:'C'  , 1:'C'  , 2:'C'},
               ('C2',5) : {0:'A'  , 1:'A'  , 2:'A'},
               ('C2',6) : {0:'B'  , 1:'B'  , 2:'B'},
               ('C2',7) : {0:'C'  , 1:'C'  , 2:'C'},
               ('C3',8) : {0:'A'  , 1:'A'  , 2:'A'},
               ('C3',9) : {0:'B'  , 1:'B'  , 2:'B'},
               ('C3',10) : {0:'C'  , 1:'C'  , 2:'C'}
              })

    C0      C1          C2          C3
    0   1   2   3   4   5   6   7   8   9   10
0   ID1 ID1 A   B   C   A   B   C   A   B   C
1   ID2 ID2 A   B   C   A   B   C   A   B   C
2   ID3 ID3 A   B   C   A   B   C   A   B   C

ID 列实际上并不是相同的值,但此数据的唯一键跨多个列。同样,As、Bs、Cs 实际上并不是相同的值,只是不同类型的值。期望的最终结果是这样的

    0   1   2   3   4   5
0   ID1 ID1 C1  A   B   C
1   ID1 ID1 C1  A   B   C
2   ID1 ID1 C1  A   B   C
3   ID2 ID2 C2  A   B   C
4   ID2 ID2 C2  A   B   C
5   ID2 ID2 C2  A   B   C
6   ID3 ID3 C3  A   B   C
7   ID3 ID3 C3  A   B   C
8   ID3 ID3 C3  A   B   C

在解决这个问题时,我已经到了一个中间点,我已经融化了第一位,将两个列索引都包含在一行上,但我无法将其重新转换为所需的格式.最终,我还需要列举 C 组中的行,但我相信我可以做到。第一次在这里发帖,感激不尽,但我已经尽我所能检查了这里和其他地方。

【问题讨论】:

  • @Onyambu 太棒了,谢谢。我的玩具示例并没有准确地转换为真实数据 - 但您的解决方案绝对展示了这些概念,我很快就能将其调整为真实数据集。

标签: python-3.x pandas reshape melt


【解决方案1】:

你可以先融化然后解开:

s = df.melt(id_vars = list(df.columns[:2]), value_vars = list(df.columns[2:]))
d = s.assign(nm = s.groupby(list(s.columns[:3])).cumcount()).drop('variable_1', 1)
d.set_index(list(d.drop('value', 1).columns)).unstack().reset_index()

    C0      variable_0 value      
nm    0    1                0  1  2
0   ID1  ID1         C1     A  B  C
1   ID1  ID1         C2     A  B  C
2   ID1  ID1         C3     A  B  C
3   ID2  ID2         C1     A  B  C
4   ID2  ID2         C2     A  B  C
5   ID2  ID2         C3     A  B  C
6   ID3  ID3         C1     A  B  C
7   ID3  ID3         C2     A  B  C
8   ID3  ID3         C3     A  B  C

你可以从这里删除你想要的列级别

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-24
    • 2014-02-25
    • 2019-09-10
    • 1970-01-01
    • 2013-08-03
    相关资源
    最近更新 更多