我正在使用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>
列变成标题为Food
,pizza
和burger
的多个列作为列名(相当多的枢纽),然后取消透视列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
答案 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