【问题标题】:Python pandas groupby category and integer variables results in pandas last and tail differencePython pandas groupby 类别和整数变量导致 pandas last 和 tail 差异
【发布时间】:2018-12-14 05:39:16
【问题描述】:

更新: 请下载我的完整数据集here。

我的数据类型是:

>>> df.dtypes
increment       int64
spread        float64
SYM_ROOT     category
dtype: object

我意识到问题可能是由于我的SYM_ROOT 是一个类别变量这一事实引起的。 要复制该问题,您可能需要先执行以下操作:

df=pd.read_csv("sf.csv")
df['SYM_ROOT']=df['SYM_ROOT'].astype('category')

但我仍然很困惑,为什么我的SYM_ROOT 会导致increment 中的空白被NA 填充?除非 groupby 类别和整数值默认会产生平衡的面板。


我注意到pd.groupby().last 的行为与pd.groupby().tail(1) 的行为不同。

例如,假设我有以下数据:

increment 是一个介于 0 到 4680 之间的整数。但是,对于某些 SYM_ROOT 变量,两者之间存在间隙。例如,其中可能缺少 4。

我想要做的是保留每组的最后一次观察。

如果我做df.groupby(['SYM_ROOT','increment']).last(),数据框变成:

如果我做df.groupby(['SYM_ROOT','increment']).tail(1),数据框变成:

在我看来,last() 语句将创建平衡的时间序列数据并用 NaN 填补空白,而 tail(1) 语句则不会。这是正确的吗?

【问题讨论】:

    标签: python pandas time-series


    【解决方案1】:

    更新:

    您的列increment 是category

    df=pd.DataFrame({'A':[1,1,2,2],'B':[1,1,2,3],'C':[1,1,1,1]})
    df.B=df.B.astype('category')
    df.groupby(['A','B']).last()
    Out[590]: 
           C
    A B     
    1 1  1.0
      2  NaN
      3  NaN
    2 1  NaN
      2  1.0
      3  1.0
    

    当您使用tail 时,它不会弥补未命中级别,因为tail 更像是数据框基础,而不是单列

    df.groupby(['A','B']).tail(1)
    Out[593]: 
       A  B  C
    1  1  1  1
    2  2  2  1
    3  2  3  1
    

    使用astype挂起后

    df.B=df.B.astype('int')
    df.groupby(['A','B']).last()
    Out[591]: 
         C
    A B   
    1 1  1
    2 2  1
      3  1
    

    【讨论】:

    • 我认为这与我的问题不同
    • 我的增量变量是不连续的(其中一些有差距),而其他变量可以填补这个差距。
    • 嗯...我认为我的“增量”是整数?
    • @JinhuaWang df.dtypes
    • 我查了,类型是numpy.int64。除非 groupby 声明将其更改为类别?
    【解决方案2】:

    这实际上是Github 的问题,该问题主要是由 groupby 类别猜测值引起的。

    【讨论】:

      猜你喜欢
      • 2023-02-25
      • 2016-12-26
      • 2018-10-07
      • 2020-06-19
      • 1970-01-01
      • 2021-02-18
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      相关资源
      最近更新 更多