亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何在 Pandas 中跨列進行 COUNTIFS

如何在 Pandas 中跨列進行 COUNTIFS

富國滬深 2023-07-27 10:30:26
我想對跨列中每個值的數量進行求和。這相當于 Excel 中的 COUNTIF。但是,我希望將值填充到列中,而不是單獨的 groupby 語句中。因此,如果第 1 行有 5 列,其值如下:1, 1, 3, 1, 5那么Rating_1 = 3、Rating_2=0、Rating_3=1、Rating_4= 0、Rating_5 = 1 或 (3, 0, 1, 0, 1)我正在使用以下代碼,并且無法獲取要在循環中添加的布爾值(我所有的研究表明它們應該加起來很好?。,F在,我得到以下(二進制)輸出:1, 0, 1, 0, 1(實際上應該是 3, 0, 1, 0, 1)df = pd.DataFrame(np.random.randint(0,5,size=(5, 5)), columns=list('ABCDE'))for val in range(1,6):    df['Rating_' + str(val)] = 0for val in range(1,6):    for row in range(0, df.shape[0]):        df['Rating_' + str(val)][row] = ((df['A'][row] == val) +  (df['B'][row] == val) +  (df['C'][row] == val) +  (df['D'][row] == val) +  (df['E'][row] == val)).sum()我也很高興讓這段代碼變得更干凈、更高效,但最關心的是讓它工作!提前感謝您的幫助!
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

您可以使用它groupby來創建一個臨時數據幀,您可以對其進行處理并最終與 合并df。


np.random.seed(1) # always add a sample with random state for reproducibility

df = pd.DataFrame(np.random.randint(0,5,size=(5, 5)), columns=list('ABCDE'))



df2 = df.stack().droplevel(-1).reset_index()

df2 = (

    df2.groupby(df2.columns.to_list())

    .size().unstack()

    .fillna(0).astype(int)

)

df = pd.concat([df, df2], axis=1)    

輸出


   A  B  C  D  E  0  1  2  3  4

0  3  4  0  1  3  1  1  0  2  1

1  0  0  1  4  4  2  1  0  0  2

2  1  2  4  2  4  0  1  2  0  2

3  3  4  2  4  2  0  0  2  1  2

4  4  1  1  0  1  1  3  0  0  1

我知道這看起來與在 Excel 中添加公式的方式非常相似,但請考慮將數據和結果保留為單獨的數據幀(即跳過 ),pd.concat以便在進一步的代碼中獲得更好的可用性。如果您需要對原始數據執行其他操作,則必須刪除這些列,這不是常見的做法,并且使用您的代碼的其他人可能不會期望這種行為。


查看完整回答
反對 回復 2023-07-27
?
當年話下

TA貢獻1890條經驗 獲得超9個贊

稍微澄清一下問題。


df

    

   A  B  C  D  E  

0  4  3  4  2  0         

1  0  4  2  3  3          

2  3  4  1  2  1          

3  0  2  3  0  2          

4  2  4  1  3  2  


    

跨行的所需結果:取第 0 行。


計算行中 0 的出現次數。有 1. 將其放入“Ranking_0”列中

計算行中 1 的出現次數。有 0 個。將其放入“Ranking_1”列中

等等


所需輸出:


   A  B  C  D  E  Ranking_0  Ranking_1  Ranking_2  Ranking_3  Ranking_4

0  4  3  4  2  0          1          0          1          1          2

1  0  4  2  3  3          1          0          1          2          1

2  3  4  1  2  1          0          2          1          1          1

3  0  2  3  0  2          2          0          2          1          0

4  2  4  1  3  2          0          1          2          1          1

有很多方法可以做到這一點 - 所以我將使用一種對我有用但稍微簡化的方法。


import pandas as pd

import numpy as np


df = pd.DataFrame(np.random.randint(0,5,size=(5, 5)), columns=list('ABCDE'))


# The numbers you want to check for

nums = [0,1,2,3,4]

for num in nums: 

     df['Ranking_'+str(num)] = (df.iloc[:,0:5]).isin({num}).sum(1)

  1. 小心地對前 5 列進行求和,否則您將開始在 Ranking_ 列中添加內容!這就是我這樣做的原因df.iloc[:,0:5)

  2. 我用它.isin({})只是因為它很干凈。還有其他方法。

  3. .sum(1)沿水平行求和(軸=1)


查看完整回答
反對 回復 2023-07-27
  • 2 回答
  • 0 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號