Python 熊猫:pivot和pivot_表之间的差异。为什么只有pivot_工作台工作?
我有以下数据帧Python 熊猫:pivot和pivot_表之间的差异。为什么只有pivot_工作台工作?,python,pandas,pivot,Python,Pandas,Pivot,我有以下数据帧 df.head(30) struct_id resNum score_type_name score_value 0 4294967297 1 omega 0.064840 1 4294967297 1 fa_dun 2.185618 2 4294967297 1 fa_dun_dev 0.000027 3 4294967297
df.head(30)
struct_id resNum score_type_name score_value
0 4294967297 1 omega 0.064840
1 4294967297 1 fa_dun 2.185618
2 4294967297 1 fa_dun_dev 0.000027
3 4294967297 1 fa_dun_semi 2.185591
4 4294967297 1 ref -1.191180
5 4294967297 2 rama -0.795161
6 4294967297 2 omega 0.222345
7 4294967297 2 fa_dun 1.378923
8 4294967297 2 fa_dun_dev 0.028560
9 4294967297 2 fa_dun_rot 1.350362
10 4294967297 2 p_aa_pp -0.442467
11 4294967297 2 ref 0.249477
12 4294967297 3 rama 0.267443
13 4294967297 3 omega 0.005106
14 4294967297 3 fa_dun 0.020352
15 4294967297 3 fa_dun_dev 0.025507
16 4294967297 3 fa_dun_rot -0.005156
17 4294967297 3 p_aa_pp -0.096847
18 4294967297 3 ref 0.979644
19 4294967297 4 rama -1.403292
20 4294967297 4 omega 0.212160
21 4294967297 4 fa_dun 4.218029
22 4294967297 4 fa_dun_dev 0.003712
23 4294967297 4 fa_dun_semi 4.214317
24 4294967297 4 p_aa_pp -0.462765
25 4294967297 4 ref -1.960940
26 4294967297 5 rama -0.600053
27 4294967297 5 omega 0.061867
28 4294967297 5 fa_dun 3.663050
29 4294967297 5 fa_dun_dev 0.004953
根据pivot文档,我应该能够使用pivot函数在score_type_名称上重塑它
df.pivot(columns='score_type_name',values='score_value',index=['struct_id','resNum'])
但是,我得到了以下信息
但是,pivot_table函数似乎可以工作:
pivoted = df.pivot_table(columns='score_type_name',
values='score_value',
index=['struct_id','resNum'])
但至少对我来说,它不适合作进一步的分析。我希望它只将struct_id、resNum和score_type_名称作为列,而不是将score_type_名称堆叠在其他列的顶部。此外,我希望struct_id用于每一行,而不是像用于表那样聚合到连接行中
那么,有谁能告诉我如何使用pivot获得我想要的数据帧呢?此外,从文档中,我无法解释为什么pivot_表可以工作而pivot不能工作。如果我看一下pivot的第一个示例,它看起来正是我所需要的
附言。
我确实发布了一个关于这个问题的问题,但是我在演示输出方面做得太差了,我删除了它,然后再次尝试使用ipython笔记本。如果你看到这两次,我提前道歉
编辑-我想要的结果如下所示(用excel制作):
我不确定我是否理解,但我会试试看。我通常使用堆栈/取消堆栈而不是枢轴,这更接近您想要的吗
df.set_index(['struct_id','resNum','score_type_name']).unstack()
score_value
score_type_name fa_dun fa_dun_dev fa_dun_rot fa_dun_semi omega
struct_id resNum
4294967297 1 2.185618 0.000027 NaN 2.185591 0.064840
2 1.378923 0.028560 1.350362 NaN 0.222345
3 0.020352 0.025507 -0.005156 NaN 0.005106
4 4.218029 0.003712 NaN 4.214317 0.212160
5 3.663050 0.004953 NaN NaN 0.061867
score_type_name p_aa_pp rama ref
struct_id resNum
4294967297 1 NaN NaN -1.191180
2 -0.442467 -0.795161 0.249477
3 -0.096847 0.267443 0.979644
4 -0.462765 -1.403292 -1.960940
5 NaN -0.600053 NaN
我不确定你的pivot为什么不工作(我觉得应该是这样,但我可能错了),但如果我不使用“struct_id”,它确实会工作(或者至少不会给出错误)。当然,对于“struct_id”有多个不同值的完整数据集,这并不是一个真正有用的解决方案
df.pivot(columns='score_type_name',values='score_value',index='resNum')
score_type_name fa_dun fa_dun_dev fa_dun_rot fa_dun_semi omega
resNum
1 2.185618 0.000027 NaN 2.185591 0.064840
2 1.378923 0.028560 1.350362 NaN 0.222345
3 0.020352 0.025507 -0.005156 NaN 0.005106
4 4.218029 0.003712 NaN 4.214317 0.212160
5 3.663050 0.004953 NaN NaN 0.061867
score_type_name p_aa_pp rama ref
resNum
1 NaN NaN -1.191180
2 -0.442467 -0.795161 0.249477
3 -0.096847 0.267443 0.979644
4 -0.462765 -1.403292 -1.960940
5 NaN -0.600053 NaN
编辑以添加:重置索引()
将从多索引(分层)转换为更平坦的样式。列名中仍然存在一些层次结构,有时消除这些层次结构的最简单方法就是执行df.columns=['var1','var2',…]
,尽管如果执行一些搜索,会有更复杂的方法
df.set_index(['struct_id'、'resNum'、'score_type_name'])。unstack().reset_index()
要将从
pivot\u表中获得的数据帧调用为所需格式,请执行以下操作:
pivoted.columns.name=None ## remove the score_type_name
result = pivoted.reset_index() ## puts index columns back into dataframe body
我调试了一下
DataFrame.pivot()
和DataFrame.pivot\u table()
是不同的李>
pivot()
不接受索引列表李>
pivot\u table()
接受
在内部,它们都使用reset\u index()
/stack()
/unstack()
pivot()
我认为这只是简单使用的捷径 另一个警告:
pivot\u table
只允许将数字类型作为“values=”,而pivot
将字符串类型作为“values=”。对于仍然对pivot
和pivot\u table
之间的差异感兴趣的任何人来说,主要有两个差异:
pivot\u table
是pivot
的推广,它可以为一个数据透视的索引/列对处理重复值。具体来说,您可以使用关键字argumentaggfunc
为pivot\u table
提供聚合函数列表。pivot\u表的默认aggfunc
为numpy.mean
pivot_表
还支持对经透视的表的索引和列使用多列。将自动为您生成分层索引
REF:和给定的代码片段可能会帮助您进一步展平数据帧的外观
df.set_index(['struct_id','resNum','score_type_name']).unstack().reset_index()
df.loc[:,['struct_id','resNum','fa_dun','fa_dun_dev','fa_dun_rot']]
在调用pivot之前,我们需要确保数据中的行对于指定的列不具有重复值
重复给定轴
Index contains duplicate entries, cannot reshape
如果我们不能确保这一点,我们可能不得不使用pivot\u table方法
请查找下面的链接以获得更详细的解释
pivot()
用于无聚合的数据透视。因此,它不能处理一个索引/列对的重复值
由于这里的索引=['struct_id','resNum']
有多个重复项,因此pivot无法工作
但是,pivot\u table
将起作用,因为它将通过聚合来处理重复的值。堆叠有帮助,但我仍然需要它,就像我想要的输出一样,这样我就可以将内容连接到它。我似乎无法处理分层数据帧。是的,重置索引有帮助。如果没有人能告诉我为什么pivot不工作,我会很快标记这个。谢谢@当然,没问题。我也很好奇是否有人能用pivot解释这个问题!不确定,但我认为pivot
vpivot_table
问题可能与非唯一索引项有关。我遇到了类似的问题,简而言之,我最终意识到我想用作索引的列中存在过多的nan项。更详细地说,为了唯一性,我迭代了我的数据帧,但它跳过了nan条目,所以这个问题就在我的视线范围之内。为什么要在pivot_表上使用pivot?我相信开发人员希望扩展pivot
的功能,但不想破坏传统代码,因此他们添加了pivot_表
。从1.1.0版开始,DataFrame.pivot还接受索引名称列表:
df.set_index(['struct_id','resNum','score_type_name']).unstack().reset_index()
df.loc[:,['struct_id','resNum','fa_dun','fa_dun_dev','fa_dun_rot']]
Index contains duplicate entries, cannot reshape