首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python Pandas透视一列和取消透视X列

Python Pandas透视一列和取消透视X列
EN

Stack Overflow用户
提问于 2018-08-02 05:02:32
回答 2查看 764关注 0票数 0

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

到目前为止采取的步骤是将df拆分为3个独立的df(一个是Name,两个是Food和pivot,三个是取消堆叠,然后在每个上重置索引)。我不认为这是正确的方法。我只需要将基本的工作流程压缩成一个大的df (关系型dfs不适用于这个特定的任务)。

示例数据:

代码语言:javascript
复制
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

我需要的是:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-02 05:07:02

试着这样做:

代码语言:javascript
复制
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

如果格式有问题,只需重置索引,然后将列重命名为适当的名称:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2018-08-02 05:29:15

既然你提到了“取消透视”(melt)

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51642220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档