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