使用重复的条目将DF堆叠起来

问题描述

我是熊猫新手,我有一个数据集,我想更改它的显示方式。

Data set

它具有40.000行和13列,并且具有2010年('Último')和2009年('PENÚLTIMO')的财务信息

我感兴趣的部分是:“ NOME”(公司名称),“ GRUPO_DFP”(目前仅是资产负债表,但我打算添加更多),“ ORDEM_EXER”(当前或去年,2010年)或2009年),“ DS_CONTA”(资产类型),“ VL_CONTA”(值)

顺便说一下,这是所有公共信息。

因此,删除不需要的列,我得到了:

Data set,dropped columns

这里开始出现问题。

它像普通的csv一样显示信息:

ORDEM_EXER-----DS_CONTA-------------------------VL_CONTA
PENÚLTIMO-----Ativo Total-----------------------702571987.0
ÚLTIMO--------Ativo Total-----------------------802819794.0
PENÚLTIMO-----Caixa e Equivalentes de Caixa-----31037881.0
ÚLTIMO--------Caixa e Equivalentes de Caixa-----25219700.0

但是我想要的是:

                  ÚLTIMO      PENÚLTIMO
 DS_CONTA
Ativo Total ----802819794.0--702571987.0
Caixa e Eq..----25219700.0---31037881.0

经过多次尝试,我得到了:

DF = DF.set_index(['NOME','GRUPO_DFP','DS_CONTA','ORDEM_EXER'],append=True)
DF.unstack() 

result

还是,这不是我想要的。 尝试跳过第一行并仅进行堆叠,将返回错误

ValueError:索引包含重复的条目,无法重塑

所以,我真的无能为力。

解决方法

好吧,如果我理解正确,那么您真的只想为 DS_CONTA

设置索引
DF = DF.set_index(['DS_CONTA'])

对吗?

,

像您一样的数据框:

df = pd.DataFrame([['PENÚLTIMO','Ativo Total','702571987.0'],['ÚLTIMO','802819794.0'],['PENÚLTIMO','Caixa e Equivalentes de Caixa','31037881.0'],'25219700.0']],columns=['ORDEM_EXER','DS_CONTA','VL_CONTA'])

代表此:

    ORDEM_EXER--DS_CONTA-----------------------VL_CONTA
0   PENÚLTIMO---Ativo Total--------------------702571987.0
1   ÚLTIMO------Ativo Total--------------------802819794.0
2   PENÚLTIMO---Caixa e Equivalentes de Caixa--31037881.0
3   ÚLTIMO------Caixa e Equivalentes de Caixa--25219700.0

尝试使用数据透视:

df.pivot(index='DS_CONTA',columns='ORDEM_EXER',values='VL_CONTA')

代表此:

ORDEM_EXER-----PENÚLTIMO---------------------ÚLTIMO
DS_CONTA        
Ativo Total--------------------702571987.0---802819794.0
Caixa e Equivalentes de Caixa--31037881.0----25219700.0
,

您可以尝试使用pivot_table来获得熊猫数据框的枢轴值。 如果数据框是:

df
>>>
ORDEM_EXER  DS_CONTA    VL_CONTA
0   PENÚLTIMO   Ativo Total 702571987
1   ÚLTIMO  Ativo Total 802819794
2   PENÚLTIMO   Caixa e Equivalentes de Caixa   31037881
3   ÚLTIMO  Caixa e Equivalentes de Caixa   25219700

然后

table = pd.pivot_table(df,values='VL_CONTA',index=['DS_CONTA'],columns=['ORDEM_EXER'],aggfunc=np.sum)

enter image description here

,

首先,我们使用您的示例数据创建一个数据框:

from io import StringIO
import pandas as pd

data = '''ORDEM_EXER-----DS_CONTA-------------------------VL_CONTA
PENÚLTIMO-----Ativo Total-----------------------702571987.0
ÚLTIMO--------Ativo Total-----------------------802819794.0
PENÚLTIMO-----Caixa e Equivalentes de Caixa-----31037881.0
ÚLTIMO--------Caixa e Equivalentes de Caixa-----25219700.0
'''
df = pd.read_csv(StringIO(data),sep='-+',engine='python')

print(df)

  ORDEM_EXER                       DS_CONTA     VL_CONTA
0  PENÚLTIMO                    Ativo Total  702571987.0
1     ÚLTIMO                    Ativo Total  802819794.0
2  PENÚLTIMO  Caixa e Equivalentes de Caixa   31037881.0
3     ÚLTIMO  Caixa e Equivalentes de Caixa   25219700.0

现在,我们使用数据透视表重新格式化和总结:

print(df.pivot_table(index='DS_CONTA',aggfunc=sum,fill_value=0))


ORDEM_EXER                     PENÚLTIMO     ÚLTIMO
DS_CONTA                                           
Ativo Total                    702571987  802819794
Caixa e Equivalentes de Caixa   31037881   25219700