簡體   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