[英]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.