代码之家  ›  专栏  ›  技术社区  ›  jboxxx

dataframe.groupby更改空数据帧的数据类型

  •  2
  • jboxxx  · 技术社区  · 8 年前

    因此,我不确定以下内容本身是否是有意的,但这似乎是我之前使用的熊猫0.18.0的行为变化。我已经更新到0.23.0了,我有一些奇怪的行为…

    假设我有一个大的数据帧,叫做 dfLarge 我要一个子集 df 根据一些标准。(问题的这一部分不是繁殖所必需的,但它来自我的实际使用案例以及我如何注意到熊猫行为的变化)。但碰巧我找不到符合我要求的标准的比赛 DFlarge公司 等等。 东风 是空的。

    重要的是 东风 分享同样的东西 dtypes 作为 DFlarge公司 . 一般来说,有些人可能会这样 东风 :

    In [187]: df = pd.DataFrame(columns = ['field1','field2','field3','num1','num2'])
    
    In [188]: df['num1'] = df['num1'].astype('float64')  # assume this was inherited from dfLarge
    
    In [189]: df['num2'] = df['num2'].astype('float64')  # assume this was inherited from dfLarge
    
    In [190]: df.dtypes
    Out[190]:
    field1     object
    field2     object
    field3     object
    num1      float64
    num2      float64
    dtype: object
    

    所以现在我们有了一些字段和空数据帧的不同数据类型 东风 . 当我使用 df.groupby 同时通过求和 field1 field2 ,结果数据帧更改 dtype 我的领域。

    In [191]: dfGrouped = df.groupby(['field1','field2'])[['num1','num2']].sum().reset_index(level=['field1','field2'])
    
    In [192]: dfGrouped.dtypes
    Out[192]:
    field1     float64
    field2     float64
    num1       float64
    num2       float64
    dtype: object
    

    从熊猫资料中我可以看到, 分组依据 不应该这样做,我只发现熊猫行为的变化从0.18.0 D型 不要改变)当我遇到 TypeErrors 当我测试各种 fields 在一些弦上。有没有什么方法可以优雅地处理这个问题,而不是分配我的 D型 到新对象之前 groupby 把它们重新放在 df['field'] = df['field'].astype('newtype') 态度?谢谢您。

    1 回复  |  直到 8 年前
        1
  •  2
  •   root    8 年前

    使用 as_index=False 当指定 groupby

    我相信这个错误是由设置和重置一个空的 MultiIndex ( 子句 设置 多指标 ,然后重置它)。见 #19602 在Github问题跟踪程序上。使用 作为索引=假 防止出现此模式,因为 多指标 不会被安排的 子句 首先。

    In [2]: pd.__version__
    Out[2]: '0.23.0'
    
    In [3]: df = pd.DataFrame(columns=['field1','field2','field3','num1','num2'])
       ...: df = df.astype({'num1': 'float64', 'num2': 'float64'})
    
    In [4]: df.dtypes
    Out[4]:
    field1     object
    field2     object
    field3     object
    num1      float64
    num2      float64
    dtype: object
    
    In [5]: dfGrouped = df.groupby(['field1','field2'], as_index=False)[['num1','num2']].sum()
    
    In [6]: dfGrouped.dtypes
    Out[6]:
    field1     object
    field2     object
    num1      float64
    num2      float64
    dtype: object
    

    请注意,这也应保留非空数据帧的行为:

    In [7]: df = pd.DataFrame({'field1': list('aaaa'),
       ...:                    'field2': list('0101'),
       ...:                    'field3': list('wxyz'),
       ...:                    'num1': [0.0, 1.0, 2.0, 3.0],
       ...:                    'num2': [10.0, 11.0, 12.0, 13.0]})
    
    In [8]: df
    Out[8]:
      field1 field2 field3  num1  num2
    0      a      0      w   0.0  10.0
    1      a      1      x   1.0  11.0
    2      a      0      y   2.0  12.0
    3      a      1      z   3.0  13.0
    
    In [9]: dfGrouped = df.groupby(['field1','field2'], as_index=False)[['num1','num2']].sum()
    
    In [10]: dfGrouped.dtypes
    Out[10]:
    field1     object
    field2     object
    num1      float64
    num2      float64
    dtype: object
    
    In [11]: dfGrouped
    Out[11]:
      field1 field2  num1  num2
    0      a      0   2.0  22.0
    1      a      1   4.0  24.0