Python支持一列透视和取消pivot X列透视

Python支持一列透视和取消pivot X列透视,python,pandas,Python,Pandas,我正在使用熊猫数据帧,主要有两件事要做。我不知道哪一个是最好的顺序,但我需要将Food列转换为多个列,标题为pizza,burger,和hotdog作为列名(基本上是轴心),然后取消pivot列pd.iloc[:,2:]以便将第一个日期列到X个日期列转换为一列 迄今为止所采取的步骤是将df分成3个单独的df(一个是名称,两个是食品和枢轴,三个是取消堆叠,然后在每个df上重置索引)。我认为这不是正确的方法。我只需要将基本工作流折叠成单个大型df(关系df不适用于此特定任务) 样本数据: Name

我正在使用熊猫数据帧,主要有两件事要做。我不知道哪一个是最好的顺序,但我需要将
Food
列转换为多个列,标题为
pizza
burger
,和
hotdog
作为列名(基本上是轴心),然后取消pivot列
pd.iloc[:,2:]
以便将第一个日期列到X个日期列转换为一列

迄今为止所采取的步骤是将df分成3个单独的df(一个是
名称
,两个是
食品
和枢轴,三个是取消堆叠,然后在每个df上重置索引)。我认为这不是正确的方法。我只需要将基本工作流折叠成单个大型df(关系df不适用于此特定任务)

样本数据:

Name    Food    1/1/2018    2/1/2018    3/1/2018    4/1/2018
Mike    pizza   1           0           1           1
Mike    burger  0           3           0           0
Mike    hot dog 0           0           0           0
Bob     pizza   0           1           0           0
Bob     burger  2           0           2           2
Bob     hot dog 1.5         0           1.5         1.5
我需要的是:

Name                pizza   burger  hot dog
Mike    1/1/2018    1       0       0
Mike    2/1/2018    0       3       0
Mike    3/1/2018    1       0       0
Mike    4/1/2018    1       0       0
Bob     1/1/2018    0       2       1.5
Bob     2/1/2018    1       0       0
Bob     3/1/2018    0       2       1.5
Bob     4/1/2018    0       2       1.5
试着这样做:

df.set_index(['Name', 'Food']).stack().unstack('Food')

Food           burger  hot dog  pizza
Name                                 
Bob  1/1/2018     2.0      1.5    0.0
     2/1/2018     0.0      0.0    1.0
     3/1/2018     2.0      1.5    0.0
     4/1/2018     2.0      1.5    0.0
Mike 1/1/2018     0.0      0.0    1.0
     2/1/2018     3.0      0.0    0.0
     3/1/2018     0.0      0.0    1.0
     4/1/2018     0.0      0.0    1.0
如果存在格式问题,只需重置索引,然后将列重命名为适当的名称:

df.set_index(['Name', 'Food']).stack().unstack('Food').reset_index().rename(columns={'level_1':'date'})

Food  Name      date  burger  hot dog  pizza
0      Bob  1/1/2018     2.0      1.5    0.0
1      Bob  2/1/2018     0.0      0.0    1.0
2      Bob  3/1/2018     2.0      1.5    0.0
3      Bob  4/1/2018     2.0      1.5    0.0
4     Mike  1/1/2018     0.0      0.0    1.0
5     Mike  2/1/2018     3.0      0.0    0.0
6     Mike  3/1/2018     0.0      0.0    1.0
7     Mike  4/1/2018     0.0      0.0    1.0

因为你提到了“unpivot”(
melt


太好了,这奏效了。快速提问,如果我想在原始数据集中保留其他列作为原始列,这是一个简单的参数修复方法吗?IIUC,只需将它们粘贴到传递给
set\u index
df.melt(['Name','Food']).pivot_table(index=['Name','variable'],columns='Food',values='value')
Out[752]: 
Food           burger  hotdog  pizza
Name variable                       
Bob  1/1/2018     2.0     1.5    0.0
     2/1/2018     0.0     0.0    1.0
     3/1/2018     2.0     1.5    0.0
     4/1/2018     2.0     1.5    0.0
Mike 1/1/2018     0.0     0.0    1.0
     2/1/2018     3.0     0.0    0.0
     3/1/2018     0.0     0.0    1.0
     4/1/2018     0.0     0.0    1.0