【问题标题】:Pandas pivot table ValueError: Index contains duplicate entries, cannot reshapePandas 数据透视表 ValueError:索引包含重复条目,无法重塑
【发布时间】:2018-02-09 20:52:58
【问题描述】:

我有一个如下所示的数据框(前 3 行):

Sample_Name Sample_ID   Sample_Type IS  Component_Name  IS_Name Component_Group_Name    Outlier_Reasons Actual_Concentration    Area    Height  Retention_Time  Width_at_50_pct Used    Calculated_Concentration    Accuracy
Index                                                               
1   20170824_ELN147926_HexLacCer_Plasma_A-1-1   NaN Unknown True    GluCer(d18:1/12:0)_LCB_264.3    NaN NaN NaN 0.1 2.733532e+06    5.963840e+05    2.963911    0.068676    True    NaN NaN
2   20170824_ELN147926_HexLacCer_Plasma_A-1-1   NaN Unknown True    GluCer(d18:1/17:0)_LCB_264.3    NaN NaN NaN 0.1 2.945190e+06    5.597470e+05    2.745026    0.068086    True    NaN NaN
3   20170824_ELN147926_HexLacCer_Plasma_A-1-1   NaN Unknown False   GluCer(d18:1/16:0)_LCB_264.3    GluCer(d18:1/17:0)_LCB_264.3    NaN NaN NaN 3.993535e+06    8.912731e+05    2.791991    0.059864    True    125.927659773487    NaN

尝试生成数据透视表时:

pivoted_report_conc = raw_report.pivot(index = "Sample_Name", columns = 'Component_Name', values = "Calculated_Concentration")

我收到以下错误:

ValueError: Index contains duplicate entries, cannot reshape

我尝试重置索引,但没有帮助。我在“索引”列中找不到任何重复值。有人可以帮忙找出这里的问题吗?

预期的输出将是一个重新调整的数据框,其中只有唯一的组分名称作为列,每个样品名称的各自浓度:

Sample_Name    GluCer(d18:1/12:0)_LCB_264.3    GluCer(d18:1/17:0)_LCB_264.3    GluCer(d18:1/16:0)_LCB_264.3
20170824_ELN147926_HexLacCer_Plasma_A-1-1    NaN    NaN    125.927659773487

为了澄清,我不是要汇总数据,只是重塑它。

【问题讨论】:

  • 您在数据透视代码中用作索引的样本名称对于所有三行都是相同的。您需要具有适当 aggfunc 的 pivot_table 来聚合数据
  • 用预期的输出更新您的帖子会很有帮助。
  • 谢谢@andrew_reece。我已经更新了帖子以反映所需的输出。
  • 您使用的是什么版本的 Pandas 和 Python?使用 Pandas 0.20.3 和 Python 3.6 以及您给定的示例数据,即使我使用 df.index = [1,1,2] 在初始索引中明确复制,您的 pivot() 语句也会产生您预期的输出。
  • @andrew_reece 我正在使用 Pandas 0.19.2 和 Python 2.7.13 我可以尝试更新软件包以查看是否有帮助。

标签: python pandas


【解决方案1】:

您可以使用groupby()unstack() 来解决您在使用pivot() 时看到的错误。

这是一些示例数据,添加了一些边缘情况,并删除了一些列值或替换了MCVE

# df
      Sample_Name  Sample_ID     IS Component_Name Calculated_Concentration Outlier_Reasons
Index                                                                    
1             foo        NaN   True              x                  NaN              NaN  
1             foo        NaN   True              y                  NaN              NaN 
2             foo        NaN   False             z            125.92766              NaN 
2             bar        NaN   False             x                 1.00              NaN  
2             bar        NaN   False             y                 2.00              NaN  
2             bar        NaN   False             z                  NaN              NaN  

(df.groupby(['Sample_Name','Component_Name'])
   .Calculated_Concentration
   .first()
   .unstack()
)

输出:

Component_Name    x   y          z
Sample_Name                       
bar             1.0 2.0        NaN
foo             NaN NaN  125.92766

【讨论】:

    【解决方案2】:

    您应该能够通过使用pandas.pivot_table() 功能(如here 所述)来完成您想要做的事情。

    将您的数据框存储为df,使用以下代码:

    import pandas as pd
    df = pd.read_table('table_from_which_to_read')
    
    new_df = pd.pivot_table(df,index=['Simple Name'], columns = 'Component_Name', values = "Calculated_Concentration")
    

    如果您需要浓度值的平均值以外的其他值,则需要更改aggfunc 参数。

    编辑

    由于您不想汇总这些值,因此您可以使用 DataFrame 上的 set_index 函数以及找到的文档 here 来重塑数据。

    import pandas as pd
    df = pd.DataFrame({'NonUniqueLabel':['Item1','Item1','Item1','Item2'],
         'SemiUniqueValue':['X','Y','Z','X'], 'Value':[1.0,100,5,None])
    
    new_df = df.set_index(['NonUniqueLabel','SemiUniqueLabel'])
    

    生成的表应该看起来像您期望的结果,并且将具有多索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 2021-12-22
      相关资源
      最近更新 更多