猿问

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

我正在尝试对数据框中的每一行应用以下函数。数据框如下所示:


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)

然而,整个专栏都充满了平局。我认为与我构建该功能的方式有关,但无法弄清楚是什么


天涯尽头无女友
浏览 103回答 3
3回答

皈依舞

如果只有一个在 中使用第一列,则可以DataFrame.mode通过 来使用和计算非缺失值:DataFrame.countdrawnumpy.wheredf1 = df.mode(axis=1)print (df1)   0    10  a  NaN1  b  NaN2  a    bdf['winner_columns'] = np.where(df1.count(axis=1).eq(1), df1[0], 'draw')print (df)  vote_1 vote_2 vote_3 vote_4 winner_columns0      a      a      a      b              a1      b      b      a      b              b2      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 ydf['winner_columns'] = df.apply(winner,axis=1)print (df)  vote_1 vote_2 vote_3 vote_4 winner_columns0      a      a      a      b              a1      b      b      a      b              b2      b      a      a      b           draw

一只名叫tom的猫

第一个问题是您的 DataFrame 有时包含一个字母后跟一个点。因此,要单独查找,'a'或者'b'您必须将这些点替换为空字符串,例如:df.replace('\.', '', regex=True)另一个问题(在您的情况下没有出现)是,一行只能包含or 'a','b'并且您的代码应该能够抵抗 此类源行中缺少特定结果的情况。为了使您的函数能够抵抗这种情况,请将其更改为:def winner(row):&nbsp; &nbsp; vc = row.value_counts()&nbsp; &nbsp; a = vc.get('a', 0)&nbsp; &nbsp; b = vc.get('b', 0)&nbsp; &nbsp; if a > b: return 'a'&nbsp; &nbsp; elif a < b: return 'b'&nbsp; &nbsp; else: return 'draw'然后您可以应用您的函数,但如果您想将其应用到每一 行(而不是列),您应该传递axis=1。因此,总而言之,将代码更改为:df['winner_columns'] = df.replace('\.', '', regex=True).apply(winner, axis=1)对于您的示例数据,结果是:&nbsp; vote_1 vote_2 vote_3 vote_4 winner_columns0&nbsp; &nbsp; &nbsp;a.&nbsp; &nbsp; &nbsp;a.&nbsp; &nbsp; &nbsp;a.&nbsp; &nbsp; &nbsp; b&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a1&nbsp; &nbsp; &nbsp;b.&nbsp; &nbsp; &nbsp;b.&nbsp; &nbsp; &nbsp; a&nbsp; &nbsp; &nbsp; b&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b2&nbsp; &nbsp; &nbsp;b.&nbsp; &nbsp; &nbsp;a.&nbsp; &nbsp; &nbsp; a&nbsp; &nbsp; &nbsp; b&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;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_columns0   a        a         a        b       a1   b        b         a        b       b2   b        a         a        b       draw
随时随地看视频慕课网APP

相关分类

Python
我要回答