在Pivos中旋转-ValueError:索引包含重复的条目,无法重塑

时间:2020-04-03 11:20:54

标签: python pandas pivot

我是python和pandas的新手,我正在尝试转换一些数据。 我有一个包含三列的数据集,如下所示:

A       B               C
col1    21-03-2019      1.2
col2    21-03-2019      23
col3    21-03-2019      45
col4    21-03-2019      2.4
col5    21-03-2019      78
col1    14-07-2019      0.1
col2    14-07-2019      AM
col3    14-07-2019      CDM
col4    14-07-2019      66
col5    14-07-2019      0.1

我打算使用B作为索引来旋转数据框,并且数据透视表工作正常。

import pandas as pd 

# creating a dataframe 
df = pd.DataFrame({'A': ['col1', 'col2', 'col3', 'col4', 'col5', 'col1', 'col2', 'col3' ,'col4', 'col5'], 
      'B': [21-03-2019,21-03-2019,21-03-2019,21-03-2019,21-03-2019, 14-07-2019,14-07-2019,14-07-2019,14-07-2019,14-07-2019], 
      'C': [1.2, 23, 45, 2.4, 78, 0.1, 'AM', 'CDM', 66, 0.1]}) 

df.pivot(index='B', columns='A', values='C')



A            col1 col2 col3 col4 col5
B                           
21-03-2019  1.2   23   45   2.4   78
14-07-2019  0.1   AM   CDM  66    0.1

但是在我的数据框中,所有记录的B列都是相同的,如下所示:

A       B               C
col1    21-03-2019      1.2
col2    21-03-2019      23
col3    21-03-2019      45
col4    21-03-2019      2.4
col5    21-03-2019      78
col1    21-03-2019      0.1
col2    21-03-2019      AM
col3    21-03-2019      CDM
col4    21-03-2019      66
col5    21-03-2019      0.1

在这种情况下,枢轴失败并显示以下错误:

ValueError: Index contains duplicate entries, cannot reshape

我尝试重置索引(尽管我不知道重置索引的含义)df.pivot(index='B', columns='B', values='C').reset_index('B'),但仍然是相同的错误。

我的预期输出是:

A           col1  col2 col3 col4  col5
B                           
21-03-2019  1.2   23   45   2.4   78
21-03-2019  0.1   AM   CDM  66    0.1

我该如何解决?有人可以帮我吗?

1 个答案:

答案 0 :(得分:2)

如果每个组都存在col1,则首先可以通过比较Series.eq和累积和Series.cumsum的值来创建辅助列g

df['g'] = df['A'].eq('col1').cumsum()

然后对于没有聚合解决方案的情况,将DataFrame.set_indexSeries.unstack结合使用:

df1 = df.set_index(['B', 'g', 'A'])['C'].unstack()

或者可以使用DataFrame.pivot_table使用第一个值进行聚合:

df1 = df.pivot_table(index=['B', 'g'], columns='A', values='C', aggfunc='first')
print (df1)
A            col1 col2 col3 col4 col5
B          g                         
21-03-2019 1  1.2   23   45  2.4   78
           2  0.1   AM  CDM   66  0.1

最后可能会删除助手level of MultiIndex

df1 = df1.reset_index(level=1, drop=True)
print (df1)
A          col1 col2 col3 col4 col5
B                                  
21-03-2019  1.2   23   45  2.4   78
21-03-2019  0.1   AM  CDM   66  0.1