【问题标题】:Pivot table with Pandas float and int values带有 Pandas 浮点数和整数值的数据透视表
【发布时间】:2015-04-13 14:53:29
【问题描述】:

大家早上好

Python 2.7.3.final.0

熊猫 0.15.1

我必须旋转多个值.... float 和 int ...但它不起作用。 下面是一些例子

import pandas as pd
import decimal
import numpy as np

data = [[decimal.Decimal('696.00'), decimal.Decimal('1876.53'), decimal.Decimal('2578.53'), 518L, 2008, 'Ala'], [decimal.Decimal('705.52'), decimal.Decimal('4534.33'), decimal.Decimal('5246.33'), 525L, 2007, 'Ala']]
headers = ['A', 'B', 'C', 'D', 'E', 'F']
df = pd.DataFrame(data, columns=headers)

columns = ['E']
rows = ['F']
value = ['A', 'B'] # A float, B float

pivot_df = df.pivot_table(columns=columns,
                                  index=rows,
                                  values=value,
                                  margins=True,
                                  aggfunc=np.sum)

结果

          A                         B                  
E      2007    2008      All     2007     2008      All
F                                                      
Ala  705.52  696.00  1401.52  4534.33  1876.53  6410.86
All  705.52  696.00  1401.52  4534.33  1876.53  6410.86

所有权利!

value = ['A', 'D'] # A float, D int

pivot_df = df.pivot_table(columns=columns,
                                  index=rows,
                                  values=value,
                                  margins=True,
                                  aggfunc=np.sum)

结果

       D           
E   2007 2008   All
F                  
Ala  525  518  1043
All  525  518  1043

不工作.....

还有想法?

问候。

曼努埃尔

【问题讨论】:

    标签: python-2.7 pandas pivot


    【解决方案1】:

    这可能是一种解决方法或解释,而不是答案,但 FWIW。

    我怀疑您实际上不需要将任何内容存储为小数,只需要浮点数(实际上您在问题中将小数类型称为浮点数,但它们不是一回事,请尝试df.info())。我建议首先从浮点数开始,或者转换它们:

    value=['A','D']
    
    df[value] = df[value].astype(float)
    

    十进制类型被存储为对象。除非你真的需要这样做,否则浮动会更快更容易使用。如果你这样做是因为你想看到两位小数,只需在浮点数上使用格式,尽管 pandas 的默认格式选择通常是你想要的。如果您使用 ipython,请查看 %precision 魔法,它可以让您指定浮点数的默认格式。

    现在,它工作正常:

    df.pivot_table(columns=columns, index=rows,       values=value,
                   margins=True,    aggfunc=np.sum)
    
              A                  D           
    E      2007 2008      All 2007 2008   All
    F                                        
    Ala  705.52  696  1401.52  525  518  1043
    All  705.52  696  1401.52  525  518  1043
    

    现在,说了这么多,我认为你所做的没有任何问题,这可能是 pandas 中的一个错误。同时,我会坚持用更简单的方法(浮点数而不是小数),除非你真的有理由使用小数类型,然后问题就不会出现。

    【讨论】:

    • 变量 DATA 是使用 django-sql -explorer (github.com/epantry/django-sql-explorer) 执行的查询的结果。为了结束这件事,我将按照建议进行类型转换。我需要一个循环数据帧系列并仅将十进制系列转换为浮点数的程序(有字符串系列、整数系列等)。你能帮助我吗?谢谢
    • 抱歉,我不确定。我会说使用convert_objects(),如此处所述:stackoverflow.com/questions/19864028/… 但我刚刚检查过,它似乎不适用于小数。我对 django-sql-explorer 一无所知,但我希望它有一些选项可以输出为浮点数,不是吗?否则,我会在这里发布一个新问题,询问如何自动将十进制对象转换为浮点数(尽管可能涉及编写一个短函数)。
    • 不过,我确实看到了更好的方法。我会在上面编辑。简而言之,您使用value 指定值,因此您可以在执行枢轴之前将其转换为浮点数。这些是唯一需要转换的列,即使不是 int 或 float,也可能是数字类型。
    猜你喜欢
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2020-08-30
    • 2020-05-21
    • 2016-09-11
    • 2018-09-27
    相关资源
    最近更新 更多