我有一個數據框如下: Date Group Value Duration2018-01-01 A 20 302018-02-01 A 10 602018-01-01 B 15 1802018-02-01 B 30 2102018-03-01 B 25 238 2018-01-01 C 10 2352018-02-01 C 15 130我想group_by動態使用,即不希望鍵入group_by要應用的列名。具體來說,我想計算mean每個組最近兩個月的數據。正如我們所看到的,并非每個組的數據都出現在上述數據框中的所有日期。所以任務如下:添加一個基于日期的虛擬行,以防與Date = 2018-03-01每個組不存在的數據相關(例如為 A 和 C 添加行)。group_by使用最近兩個月的Value和執行計算均值Duration。所以我的做法如下:對于任務 1: s = pd.MultiIndex.from_product(df['Date'].unique(),df['Group'].unique()],names=['Date','Group']) df = df.set_index(['Date','Group']).reindex(s).reset_index().sort_values(['Group','Date']).ffill(axis=0) 我們可以有更好的方法來完成“添加行”任務嗎?可在此處找到參考。對于任務 2:def cond_grp_by(df,grp_by:str,cols_list:list,*args): df_grp = df.groupby(grp_by)[cols_list].transform(lambda x : x.tail(2).mean()) return df_grpdf_cols = df.columns.tolist()df = cond_grp_by(dealer_f_filt,'Group',df_cols)可以在此處找到上述方法的參考。上面的代碼正在拋出IndexError : Column(s) ['index','Group','Date','Value','Duration'] already selected預期的輸出是Group Value Duration A 10 60 <--------- Since a row is added for 2018-03-01 with B 27.5 224 same value as 2018-02-01,we are C 15 130 <--------- computing mean for last two values
1 回答

30秒到達戰場
TA貢獻1828條經驗 獲得超6個贊
如果需要由聚合值填充的輸出,GroupBy.agg
請改用:transform
def cond_grp_by(df,grp_by:str,cols_list:list,*args):
return df.groupby(grp_by)[cols_list].agg(lambda x : x.tail(2).mean()).reset_index()
df = cond_grp_by(df,'Group',df_cols)
print (df)
Group Value Duration
0 A 10.0 60.0
1 B 27.5 224.0
2 C 15.0 130.0
如果需要每個組的最后一個值,請使用GroupBy.last
:
def cond_grp_by(df,grp_by:str,cols_list:list,*args):
return df.groupby(grp_by)[cols_list].last().reset_index()
df = cond_grp_by(df,'Group',df_cols)
添加回答
舉報
0/150
提交
取消