繁体   English   中英

在 groupby 之后来自 nunique 的奇怪 output

[英]Strange output from nunique after groupby

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

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

如果transform('nunique')文档明确指出:

返回 object 中唯一元素的数量。

返回:整数

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

调用 func 自行生成具有转换值的 DataFrame。 生产的 DataFrame 将具有与自己相同的轴长。

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

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

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

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

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

Output:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM