2 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
您可以使用它groupby來創(chuàng)建一個(gè)臨時(shí)數(shù)據(jù)幀,您可以對其進(jìn)行處理并最終與 合并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 中添加公式的方式非常相似,但請考慮將數(shù)據(jù)和結(jié)果保留為單獨(dú)的數(shù)據(jù)幀(即跳過 ),pd.concat以便在進(jìn)一步的代碼中獲得更好的可用性。如果您需要對原始數(shù)據(jù)執(zhí)行其他操作,則必須刪除這些列,這不是常見的做法,并且使用您的代碼的其他人可能不會期望這種行為。

TA貢獻(xiàn)1890條經(jīng)驗(yàn) 獲得超9個(gè)贊
稍微澄清一下問題。
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
跨行的所需結(jié)果:取第 0 行。
計(jì)算行中 0 的出現(xiàn)次數(shù)。有 1. 將其放入“Ranking_0”列中
計(jì)算行中 1 的出現(xiàn)次數(shù)。有 0 個(gè)。將其放入“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
有很多方法可以做到這一點(diǎn) - 所以我將使用一種對我有用但稍微簡化的方法。
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)
小心地對前 5 列進(jìn)行求和,否則您將開始在 Ranking_ 列中添加內(nèi)容!這就是我這樣做的原因
df.iloc[:,0:5)
我用它
.isin({})
只是因?yàn)樗芨蓛簟_€有其他方法。.sum(1)
沿水平行求和(軸=1)
添加回答
舉報(bào)