簡體   English   中英

將函數應用於數據框中的每一行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM