【问题标题】:Strange output from nunique after groupby在 groupby 之后来自 nunique 的奇怪输出
【发布时间】:2020-06-30 13:38:07
【问题描述】:

我对以下代码的行为很感兴趣:

import pandas as pd
df = pd.DataFrame({'Name':['A','A','B','B','B'],
                   'Date':['2020-01-01','2020-01-02','2020-01-01','2020-01-02','2020-01-03']})
df['Date'] = pd.to_datetime(df['Date'],infer_datetime_format=True)
df['Data_Points'] = df.groupby(['Name'])['Date'].transform('nunique')
print(df)

哪些输出:

  Name       Date                   Data_Points
0    A 2020-01-01 1970-01-01 00:00:00.000000002
1    A 2020-01-02 1970-01-01 00:00:00.000000002
2    B 2020-01-01 1970-01-01 00:00:00.000000003
3    B 2020-01-02 1970-01-01 00:00:00.000000003
4    B 2020-01-03 1970-01-01 00:00:00.000000003

如果pandas.Series.nunique 的文档明确指出,为什么我在使用transform('nunique') 后会得到一个日期时间值:

返回对象中唯一元素的数量。

返回: 诠释

pandas.DataFrame.transform 没有提到任何关于保留聚合列的 dtype 的内容,只是:

在自身上调用 func 生成具有转换值的 DataFrame。 生成的 DataFrame 将具有与自身相同的轴长度。

因此,当结合这两个功能时,为什么我得到一个datetime 而不是nunique() 所说的int?在定义转换列的dtype 时,聚合的dtype 是否优先于transform() 方法中传递的函数?这是预期的行为吗?

【问题讨论】:

    标签: python pandas group-by


    【解决方案1】:

    IIUC,这是因为转换后的结果作为日期时间(原始)类型插入回来。添加astype(int)即可解决:

    df.groupby('Name')["Date"].transform("nunique").astype(int)
    

    输出:

    0    2
    1    2
    2    3
    3    3
    4    3
    Name: Date, dtype: int64
    

    【讨论】:

      【解决方案2】:

      我认为这是错误,可能的解决方案:

      df['Data_Points'] = df.groupby(['Name'])['Date'].transform(pd.Series.nunique)
      print(df)
        Name       Date  Data_Points
      0    A 2020-01-01            2
      1    A 2020-01-02            2
      2    B 2020-01-01            3
      3    B 2020-01-02            3
      4    B 2020-01-03            3
      

      【讨论】:

      • 谢谢,这是个好主意,我创建了一个新的数据框,因为df.groupby(['Customer Name','Time Periods'])['Sales_Date'].nunique() 也确实返回了int,然后我又加入了。 +1 快速解答和解决方案
      猜你喜欢
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多