Python 重新排列数据帧

Python 重新排列数据帧,python,pandas,Python,Pandas,我有一个df如下: Country Product Value 11/01/1998 12/01/1998 01/01/1999 ... 07/01/2022 08/01/2022 09/01/2022 10/01/2022 11/01/2022 12/01/2022 0 France NaN Market 3330 7478 2273 ... NaN

我有一个df如下:

                   Country Product   Value 11/01/1998 12/01/1998 01/01/1999  ... 07/01/2022 08/01/2022 09/01/2022 10/01/2022 11/01/2022 12/01/2022
0                   France     NaN  Market       3330       7478       2273  ...        NaN        NaN        NaN        NaN        NaN        NaT
1                   France     NaN   World        362        798        306  ...        NaN        NaN        NaN        NaN        NaN        NaT
3                  Germany     NaN  Market       1452       2025       1314  ...        NaN        NaN        NaN        NaN        NaN        NaT
4                  Germany     NaN   World        209        246        182  ...        NaN        NaN        NaN        NaN        NaN        NaT
6                    Spain     NaN  Market       1943       2941       1426  ...        NaN        NaN        NaN        NaN        NaN        NaT
..                     ...     ...     ...        ...        ...        ...  ...        ...        ...        ...        ...        ...        ...
343  Serbia and Montenegro       0   World          0          0          0  ...        NaN        NaN        NaN        NaN        NaN        NaT
345               Slovenia       0  Market         26         24         20  ...        NaN        NaN        NaN        NaN        NaN        NaT
346               Slovenia       0   World          0          0          1  ...        NaN        NaN        NaN        NaN        NaN        NaT
348               Slovakia       0  Market          2          2          0  ...        NaN        NaN        NaN        NaN        NaN        NaT
349               Slovakia       0   World          1          1          0  ...        NaN        NaN        NaN        NaN        NaN        NaT
我试图重新排列数据,我想我需要在转置、熔化和/或堆栈之间进行某种组合。我已经通读了文档,但我似乎不明白它的意思。我尝试过的所有组合都无法满足我的需求

列应该是:国家、产品、市场、世界、日期(转换日期),然后值应该在市场或世界列下

有什么想法吗


非常感谢,如果我能提供更多信息,请告诉我。

IIUC您需要将
melt
set\u index
unstack
相结合:

print (df.melt(id_vars=["Country", "Product", "Value"])
         .set_index(["Country", "Product", "Value", "variable"])
         .unstack("Value").reset_index())

                     Country Product    variable  value      
Value                                            Market World
0                     France     NaN  01/01/1999   2273   306
1                     France     NaN  07/01/2022    NaN   NaN
2                     France     NaN  08/01/2022    NaN   NaN
3                     France     NaN  09/01/2022    NaN   NaN
4                     France     NaN  10/01/2022    NaN   NaN
5                     France     NaN  11/01/1998   3330   362
6                     France     NaN  11/01/2022    NaN   NaN
7                     France     NaN  12/01/1998   7478   798
8                     France     NaN  12/01/2022    NaT   NaT
9                    Germany     NaN  01/01/1999   1314   182
10                   Germany     NaN  07/01/2022    NaN   NaN
11                   Germany     NaN  08/01/2022    NaN   NaN
12                   Germany     NaN  09/01/2022    NaN   NaN
13                   Germany     NaN  10/01/2022    NaN   NaN
14                   Germany     NaN  11/01/1998   1452   209
15                   Germany     NaN  11/01/2022    NaN   NaN
16                   Germany     NaN  12/01/1998   2025   246
17                   Germany     NaN  12/01/2022    NaT   NaT
18     Serbia and Montenegro     0.0  01/01/1999    NaN     0
19     Serbia and Montenegro     0.0  07/01/2022    NaN   NaN
20     Serbia and Montenegro     0.0  08/01/2022    NaN   NaN
21     Serbia and Montenegro     0.0  09/01/2022    NaN   NaN
22     Serbia and Montenegro     0.0  10/01/2022    NaN   NaN
23     Serbia and Montenegro     0.0  11/01/1998    NaN     0
24     Serbia and Montenegro     0.0  11/01/2022    NaN   NaN
25     Serbia and Montenegro     0.0  12/01/1998    NaN     0
26     Serbia and Montenegro     0.0  12/01/2022    NaN   NaT
27                  Slovakia     0.0  01/01/1999      0     0
28                  Slovakia     0.0  07/01/2022    NaN   NaN
29                  Slovakia     0.0  08/01/2022    NaN   NaN
30                  Slovakia     0.0  09/01/2022    NaN   NaN
31                  Slovakia     0.0  10/01/2022    NaN   NaN
32                  Slovakia     0.0  11/01/1998      2     1
33                  Slovakia     0.0  11/01/2022    NaN   NaN
34                  Slovakia     0.0  12/01/1998      2     1
35                  Slovakia     0.0  12/01/2022    NaT   NaT
36                  Slovenia     0.0  01/01/1999     20     1
37                  Slovenia     0.0  07/01/2022    NaN   NaN
38                  Slovenia     0.0  08/01/2022    NaN   NaN
39                  Slovenia     0.0  09/01/2022    NaN   NaN
40                  Slovenia     0.0  10/01/2022    NaN   NaN
41                  Slovenia     0.0  11/01/1998     26     0
42                  Slovenia     0.0  11/01/2022    NaN   NaN
43                  Slovenia     0.0  12/01/1998     24     0
44                  Slovenia     0.0  12/01/2022    NaT   NaT
45                     Spain     NaN  01/01/1999   1426   NaN
46                     Spain     NaN  07/01/2022    NaN   NaN
47                     Spain     NaN  08/01/2022    NaN   NaN
48                     Spain     NaN  09/01/2022    NaN   NaN
49                     Spain     NaN  10/01/2022    NaN   NaN
50                     Spain     NaN  11/01/1998   1943   NaN
51                     Spain     NaN  11/01/2022    NaN   NaN
52                     Spain     NaN  12/01/1998   2941   NaN
53                     Spain     NaN  12/01/2022    NaT   NaN

请发布您的预期输出。这太棒了!非常感谢。一个简单的问题-看起来它现在是多索引的。如何再次合并这些列并使其成为列名中的单个索引?将结果分配给一个变量,例如
s=df.melt(…)
,然后
s.columns=[“国家”、“产品”、“日期”、“市场”、“世界”]