我是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
我该如何解决?有人可以帮我吗?
答案 0 :(得分:2)
如果每个组都存在col1
,则首先可以通过比较Series.eq
和累积和Series.cumsum
的值来创建辅助列g
:
df['g'] = df['A'].eq('col1').cumsum()
然后对于没有聚合解决方案的情况,将DataFrame.set_index
与Series.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