亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

天涯盡頭無女友 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 關注
  • 212 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號