[英]Apply function to each row in a dataframe
我正在嘗試為數據框中的每一行應用以下函數。 數據框如下所示:
vote_1 vote_2 vote_3 vote_4
a a a b
b b a b
b a a b
我試圖生成第四列來總結其他列的“投票”並產生獲勝者,如下所示:
vote_1 vote_2 vote_3 vote_4 winner_columns
a a a b a
b b a b b
b a a b draw
我目前嘗試過:
def winner(x):
a = new_df.iloc[x].value_counts()['a']
b = new_df.iloc[x].value_counts()['b']
if a > b:
y = 'a'
elif a < b:
y = 'b'
else:
y = 'draw'
return y
df['winner_columns'].apply(winner)
然而,整列都充滿了平局。 我認為這與我構建函數的方式有關,但無法弄清楚是什么
您可以使用DataFrame.mode
並通過DataFrame.count
計算非缺失值,如果只有一個使用第一列,否則在numpy.where
draw
:
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
第一個問題是您的 DataFrame 有時包含一個字母后跟一個點。
因此,要僅查找'a'
或'b'
您必須用空字符串替換這些點,例如:
df.replace('\.', '', regex=True)
另一個問題,你的情況,其表面didin't,是一個行只能包含'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
您可以使用.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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.