Python Pandas透视一列并取消透视X列



我正在使用pandas数据帧,有两件主要的事情要做。我不知道哪一个顺序最好,但我需要将Food列转换为多个列,这些列的标题分别为pizzaburgerhot dog作为列名(相当于透视图(,然后取消对列pd.iloc[:,2:]的透视,以便通过X个日期列的第一个日期列转换为一列。

到目前为止,所采取的步骤是将df拆分为3个单独的dfs(一个只是Name,两个是Food和pivot,三个是展开并重置每个dfs的索引(。我认为这不是正确的做法。我只需要将基本的工作流折叠成一个大的df(关系型dfs不适用于此特定任务(。

示例数据:

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(

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

最新更新