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