我正在使用pandas数据帧,有两件主要的事情要做。我不知道哪一个顺序最好,但我需要将Food
列转换为多个列,这些列的标题分别为pizza
、burger
和hot 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