我正在使用pandas数据帧,有两件主要的事情要做。我不知道哪个是最好的顺序,但我需要将Food
列转换为多个标题为pizza
、burger
和hot dog
的列作为列名(相当于透视图),然后取消透视列pd.iloc[:,2:]
,以便将第一个日期列转换为单个列。
到目前为止采取的步骤是将df拆分为3个独立的df(一个是Name
,两个是Food
和pivot,三个是取消堆叠,然后在每个上重置索引)。我不认为这是正确的方法。我只需要将基本的工作流程压缩成一个大的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
发布于 2018-08-02 05:07:02
试着这样做:
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
发布于 2018-08-02 05:29:15
既然你提到了“取消透视”(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
https://stackoverflow.com/questions/51642220
复制相似问题