2 回答

TA貢獻1828條經(jīng)驗 獲得超6個贊
實際上,沒有必要遍歷組行。
任務(wù)是應(yīng)用一個函數(shù)來計算每個組的比率。
需要的第一個組件是 lambda 函數(shù),應(yīng)用于組(Numpy一維數(shù)組)中的每一列,檢查所有元素是否相同。實際上,它檢查元素0是否等于從1開始的所有元素并返回1(作為True)或0作為(False)。
lambda v: (v[0] == v[1:]).all().astype(int)
那么概念就是:
grp.values
- 將當前組轉(zhuǎn)換為Numpy數(shù)組。[:, 1:-1]
- 刪除第一個 ( ID ) 和最后一個 ( ngroup ) 列。apply_along_axis(...)
- 將上述功能應(yīng)用于每個剩余的列。參數(shù)0是軸號(將函數(shù)應(yīng)用于每個列切片)。結(jié)果是一個由 1 或 0 組成的向量。... * [5, 30, 15, 50]
- 將上述向量乘以每列的權(quán)重,得到列評級。np.sum(...)
- 對它們求和,得到整體組率。
這樣做的代碼是:
def getRate(grp):
return np.sum(np.apply_along_axis(lambda v: (v[0] == v[1:]).all().astype(int),
0, grp.values[:, 1:-1]) * [5, 30, 15, 50])
然后將上述函數(shù)應(yīng)用于每個組:
df_test.groupby('ngroup').apply(getRate)
結(jié)果是:
ngroup
0 85
1 95
dtype: int64
請注意,第1組的結(jié)果是0 * 5 + 1 * 30 + 1 * 15 + 1 * 50 = 95,而不是您帖子中的75,因為PHONE列的權(quán)重為50 (請參見示例的第 1 點)。

TA貢獻1843條經(jīng)驗 獲得超7個贊
IIUC,您可以創(chuàng)建一個包含列名稱的速率字典,然后是stack您map的值,同時僅對重復值求和。
rates = {'NAME' : 5, 'LAST_NAME' : 30, 'ADDRESS' : 0 ,'PHONE' : 50 }
s = df.groupby('ngroup').agg(list).stack().explode().duplicated().to_frame()
s['vals'] = s.index.get_level_values(1).map(rates)
s[s[0].eq(True)].groupby(level=0).sum()
0 vals
ngroup
0 3.0 85.0
1 4.0 130.0
添加回答
舉報