如何在Python中{pivot | denormalize |操作} CSV表

Noa*_*sen 5 python dataframe pandas

对不起凌乱的标题,我不知道如何很好地表达这个问题.

假设我有一张桌子,其中前三列是foo bar和baz.然后有一些任意列.我想操纵表格,使这些任意列全部折叠在列上,称为num.

一个例子使这更清楚

foo, bar, baz, 100, 101, 102, 103, 104,
1,   1,   1,  10,  11,  12,  13,  14,
1,   1,   2,  15,  16,  17,  18,  19,
1,   2,   1,  20,  21,  22,  23,  24,
Run Code Online (Sandbox Code Playgroud)

此输入应转置为:

num, foo, bar, baz, value,
100,   1,    1,  1,    10,
100,   1,    1,  2,    15,
100,   1,    2,  1,    20,
101,   1,    1,  1,    11,
101,   1,    1,  2,    16,
101,   1,    2,  1,    21,
102,   1,    1,  1,    12,
102,   1,    1,  2,    17,
102,   1,    2,  1,    22,
...
Run Code Online (Sandbox Code Playgroud)

我写了一个自定义Python解决方案来做到这一点.这并不难,但我觉得这是重新发明轮子.

有没有办法用像熊猫或其他一些表操作模块这样的库完成这个?

jpp*_*jpp 6

使用pandas.melt:

res = pd.melt(df, id_vars=['foo', 'bar', 'baz'])

print(res)

    foo  bar  baz variable  value
0     1    1    1      100     10
1     1    1    2      100     15
2     1    2    1      100     20
3     1    1    1      101     11
4     1    1    2      101     16
5     1    2    1      101     21
6     1    1    1      102     12
7     1    1    2      102     17
8     1    2    1      102     22
9     1    1    1      103     13
10    1    1    2      103     18
11    1    2    1      103     23
12    1    1    1      104     14
13    1    1    2      104     19
14    1    2    1      104     24
Run Code Online (Sandbox Code Playgroud)