为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

天涯尽头无女友 2024-01-24 20:40:13
我正在尝试对数据框中的每一行应用以下函数。数据框如下所示:vote_1 vote_2 vote_3 vote_4a      a       a      b           b      b       a      b          b      a       a      b           我试图生成第四列来汇总其他列的“投票”并产生获胜者,如下所示:vote_1 vote_2 vote_3 vote_4 winner_columnsa      a       a      b           ab      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 ydf['winner_columns'].apply(winner)然而,整个专栏都充满了平局。我认为与我构建该功能的方式有关,但无法弄清楚是什么
查看完整描述

3 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

如果只有一个在 中使用第一列,则可以DataFrame.mode通过 来使用和计算非缺失值:DataFrame.countdrawnumpy.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


查看完整回答
反对 回复 2024-01-24
?
一只名叫tom的猫

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


查看完整回答
反对 回复 2024-01-24
?
沧海一幻觉

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


查看完整回答
反对 回复 2024-01-24
  • 3 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信