Python 将函数应用于数据帧中的每一行

Python 将函数应用于数据帧中的每一行,python,pandas,function,Python,Pandas,Function,我试图为数据帧中的每一行应用以下函数。数据框如下所示: 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

我试图为数据帧中的每一行应用以下函数。数据框如下所示:

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
我尝试生成第四列,将其他列的“投票数”相加,并生成赢家,如下所示:

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)
def赢家(x):
a=新的[u df.iloc[x]。值[u counts()['a']
b=new_df.iloc[x]。值_计数()['b']
如果a>b:
y='a'
如果a
但是,整个列都被绘图填充。我假设这与我构建函数的方式有关,但无法计算出您可以使用什么,如果只有一个使用第一列else
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
def赢家(x):
s=x.值_计数()
a=s['a']
b=s['b']
如果a>b:
y='a'
如果a
如果只有一个用户使用第一列else
在以下位置绘制,则可以使用和计数未缺失的值:

您的解决方案是可能的更改:

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
def赢家(x):
s=x.值_计数()
a=s['a']
b=s['b']
如果a>b:
y='a'
如果a
第一个问题是数据帧有时包含 后跟一个点的字母

因此,要单独查找
'a'
'b'
,必须替换这些点 对于空字符串,类似于:

df.replace('\.', '', regex=True)
另一个在你的案例中没有出现的问题是,一行可以 仅包含
'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'
对于示例数据,结果是:

  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

第一个问题是数据帧有时包含 后跟一个点的字母

因此,要单独查找
'a'
'b'
,必须替换这些点 对于空字符串,类似于:

df.replace('\.', '', regex=True)
另一个在你的案例中没有出现的问题是,一行可以 仅包含
'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'
对于示例数据,结果是:

  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
您可以使用统计选票,然后将获胜者保存在列表中,最后添加到数据框中

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
您可以使用统计选票,然后将获胜者保存在列表中,最后添加到数据框中

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

您是否尝试过在
df.apply()
方法中调整
axis=
参数?似乎是的重复?您是否尝试过在
df.apply()
方法中调整
axis=
参数?似乎是的重复?如果赢家有两个以上的选项,您能否帮助我调整此参数?例如,如果有4个或5个潜在的投票选择?如果有2个以上的选择作为赢家,你能帮我调整吗?例如,如果有4个或5个潜在的投票选择?