第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

迭代分組行 Python pandas

迭代分組行 Python pandas

婷婷同學_ 2022-11-18 20:56:58
假設(shè)我有一個這樣的數(shù)據(jù)框df_test = pd.DataFrame({"ID": [912665, 455378, 938724, 557830                         ],                    "NAME": ["Anna","Anna","Diana","Peter"                            ],                    "LAST_NAME": ["Johns","Johns","Scott","Scott"                            ],                    "ADDRESS": ["Address1","Address2","Address3","Address3"],                        "PHONE": ['0000000001','0000000001','0000000002','0000000002'                         ],                   "ngroup": [0, 0,1,1]}                      )df_test結(jié)果ngroup 列中有兩組 - 0 和 1在每個組中,我想對一些列(如 NAME、LAST_NAME、ADDRESS)進行比較,并給出一個名為 Rate 的新列,它根據(jù)這些行是否相同給我一個分數(shù)。例如對于第 0 組,我們可以獲得如下比率:5(因為姓名相同)+ 30(因為姓氏相同)+ 0(因為地址不同)+ 50(因為電話相同)= 85對于第 1 組:0 + 30 + 15 + 30 = 75迭代這些行并獲取新列 Rate 并將其添加到當前數(shù)據(jù)幀的最佳方法是什么?我正在嘗試一些不同的事情,但目前無法獲得任何可行的解決方案。
查看完整描述

2 回答

?
30秒到達戰(zhàn)場

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 點)。


查看完整回答
反對 回復 2022-11-18
?
藍山帝景

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


查看完整回答
反對 回復 2022-11-18
  • 2 回答
  • 0 關(guān)注
  • 147 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號