Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:pivot和pivot_表之间的差异。为什么只有pivot_工作台工作?_Python_Pandas_Pivot - Fatal编程技术网

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
    的推广,它可以为一个数据透视的索引/列对处理重复值。具体来说,您可以使用关键字argument
    aggfunc
    为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
    v
    pivot_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