Python Pandas枢转一列而未枢转X列

时间:2018-08-01 21:02:32

标签: python pandas

我正在使用pandas数据帧,有两件事要做。我不知道哪种顺序最好,但是我需要将<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <td class="membership-actions order-actions"> <a href="#" class="button cancel">Cancel</a> <a href="#" class="button view">View</a> </td>列变成标题为Foodpizzaburger的多个列作为列名(相当多的枢纽),然后取消透视列hot dog的位置,以便将第一个日期列(通过X个日期列)转换为单个列。

到目前为止,已采取的步骤是将df分为3个独立的df(一个只是pd.iloc[:,2:],两个是Name并进行数据透视,三个是unstack,然后在每个索引上重置索引)。我认为这不是正确的方法。我只需要基本的工作流程即可折叠成一个大df(关系dfs不适用于此特定任务)。

样本数据:

Food

我需要什么:

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

2 个答案:

答案 0 :(得分:1)

尝试这样:

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

答案 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