3 回答

TA貢獻1851條經驗 獲得超3個贊
如果只有一個在 中使用第一列,則可以DataFrame.mode
通過 來使用和計算非缺失值:DataFrame.count
draw
numpy.where
df1 = df.mode(axis=1)
print (df1)
? ?0? ? 1
0? a? NaN
1? b? NaN
2? a? ? b
df['winner_columns'] = np.where(df1.count(axis=1).eq(1), df1[0], 'draw')
print (df)
? vote_1 vote_2 vote_3 vote_4 winner_columns
0? ? ? a? ? ? a? ? ? a? ? ? b? ? ? ? ? ? ? a
1? ? ? b? ? ? b? ? ? a? ? ? b? ? ? ? ? ? ? b
2? ? ? b? ? ? a? ? ? a? ? ? b? ? ? ? ? ?draw
您的解決方案可能會改變:
def winner(x):
? ? s = x.value_counts()
? ? a = s['a']
? ? b = s['b']
? ? if a > b:
? ? ? ? y = 'a'
? ? elif a < b:
? ? ? ? y = 'b'
? ? else:
? ? ? ? y = 'draw'
? ? return y
df['winner_columns'] = df.apply(winner,axis=1)
print (df)
? vote_1 vote_2 vote_3 vote_4 winner_columns
0? ? ? a? ? ? a? ? ? a? ? ? b? ? ? ? ? ? ? a
1? ? ? b? ? ? b? ? ? a? ? ? b? ? ? ? ? ? ? b
2? ? ? b? ? ? a? ? ? a? ? ? b? ? ? ? ? ?draw

TA貢獻1906條經驗 獲得超3個贊
第一個問題是您的 DataFrame 有時包含一個字母后跟一個點。
因此,要單獨查找,'a'或者'b'您必須將這些點替換為空字符串,例如:
df.replace('\.', '', regex=True)
另一個問題(在您的情況下沒有出現)是,一行只能包含or 'a','b'并且您的代碼應該能夠抵抗 此類源行中缺少特定結果的情況。
為了使您的函數能夠抵抗這種情況,請將其更改為:
def winner(row):
vc = row.value_counts()
a = vc.get('a', 0)
b = vc.get('b', 0)
if a > b: return 'a'
elif a < b: return 'b'
else: return 'draw'
然后您可以應用您的函數,但如果您想將其應用到每一 行(而不是列),您應該傳遞axis=1。
因此,總而言之,將代碼更改為:
df['winner_columns'] = df.replace('\.', '', regex=True).apply(winner, axis=1)
對于您的示例數據,結果是:
vote_1 vote_2 vote_3 vote_4 winner_columns
0 a. a. a. b a
1 b. b. a b b
2 b. a. a b draw

TA貢獻1824條經驗 獲得超5個贊
您可以使用.sum()來計算選票,然后將獲勝者保存在列表中,最后添加到數據框中。
numpy_votes = dataframe_votes.to_numpy()? ??
winner_columns = []
for i in numpy_votes:
? if np.sum(i == 'a') < np.sum(i == 'b'):
? ? ?winner_columns.append('b')
? elif np.sum(i == 'a') > np.sum(i == 'b'):
? ? ?winner_columns.append('a')
? else:
? ? ?winner_columns.append('draw')
? ??
dataframe_votes['winner_columns'] = winner_columns
根據這個答案,使用 .sum() 方法是計算數組內元素的最快方法。
輸出:
? ? vote_1? vote_2? vote_3? vote_4? winner_columns
0? ?a? ? ? ? a? ? ? ? ?a? ? ? ? b? ? ? ?a
1? ?b? ? ? ? b? ? ? ? ?a? ? ? ? b? ? ? ?b
2? ?b? ? ? ? a? ? ? ? ?a? ? ? ? b? ? ? ?draw
添加回答
舉報