第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在 Python Pandas 數(shù)據(jù)幀的列中查找 max 分組并標(biāo)記它的最快方法是什么?

在 Python Pandas 數(shù)據(jù)幀的列中查找 max 分組并標(biāo)記它的最快方法是什么?

慕姐4208626 2023-10-26 10:19:51
UPDATE2:我實(shí)際上有 2000 次抽獎(jiǎng),而不是 3 次。更新:我的 df A 列是錯(cuò)誤的。我修好了它。我有下面的一個(gè)非常大的版本df。data = {'A':[11111, 11111, 33333,11111], 'B':[101, 101, 102, 101],'C':[1,2,3,4],    'draw0':[5, 6, 2, 1], 'draw1':[4,3,2,1], 'draw2':[2,3,4,6]}df = pd.DataFrame(data)     A     B   C  draw0   draw1   draw20  11111  101  1      5      4      21  11111  101  2      6      3      32  33333  102  3      2      2      43  11111  101  4      1      1      6我試圖找出每次抽獎(jiǎng)中哪些抽獎(jiǎng)列獲勝。以下是我當(dāng)前的嘗試,雖然速度緩慢,但有效。我覺得應(yīng)該有一種方法可以應(yīng)用或使它更快。draw_cols = [col for col in df if col.startswith('draw')]for col in draw_cols:    max_idx = df.groupby(['A', 'B'])[col].idxmax().values    df.loc[max_idx, col] = 1    df.loc[~df.index.isin(max_idx), col] = 0期望的輸出:     A     B   C  draw0  draw1  draw20  11111  101  1      0      1      01  11111  101  2      1      0      02  33333  102  3      1      1      13  11111  101  4      0      0      1我生成 2000 列,如下所示:def simulateDraw(df, n=2000):        #simulate n drawings from the alpha and beta values and create columns     return pd.concat([df,           df.apply(lambda row: pd.Series(np.random.beta(row.C, row.C, size=n)), axis = 1).add_prefix('draw')],          axis = 1)
查看完整描述

3 回答

?
白豬掌柜的

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊

# groupby and transform the idxmax

max_idx = df.groupby(['A', 'B'])[df.columns[3:]].transform('idxmax')

# create a new column that is just your index

# this is done just in case your real data does not have a range index

max_idx['index'] = max_idx.index.values

# where the max_idx is in the index to return bool values and then update the original df

df.update(max_idx.isin(max_idx['index']).astype(int))


       A    B  C  draw0  draw1  draw2

0  11111  101  1      0      1      0

1  11111  101  2      1      0      0

2  33333  102  3      1      1      1

3  11111  101  4      0      0      1


查看完整回答
反對 回復(fù) 2023-10-26
?
絕地?zé)o雙

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超4個(gè)贊

檢查每個(gè)組的哪一draw列等于該列的最大值


df.update(df.groupby(['A','B'])[['draw0','draw1','draw2']].apply(lambda x: x.eq(x.max(0))).astype('int'))

df

出去:


       A    B  C  draw0  draw1  draw2

0  11111  101  1      0      1      0

1  11111  101  2      1      0      0

2  33333  102  3      1      1      1

3  11111  101  4      0      0      1

微基準(zhǔn)測試

結(jié)果simulateDraw(df, n=4)

https://img1.sycdn.imooc.com/6539ccf4000194ad04340275.jpg

結(jié)果simulateDraw(df, n=50)(更多的行或列超出了我的耐心和 Colab 實(shí)例上的 RAM)

https://img1.sycdn.imooc.com/6539ccfd0001bbbf04330271.jpg

用于基準(zhǔn)測試的代碼


import pandas as pd

import numpy as np

import perfplot


def simulateDraw(df, n=2000):

    return pd.concat([df,

           df.apply(lambda row: pd.Series(np.random.beta(row.C, row.C, size=n)), axis = 1).add_prefix('draw')],

          axis = 1)


def makedata(n=1):

    data = pd.DataFrame({'A':[11111, 11111, 33333,11111] * n, 'B':[101, 101, 102, 101] * n,'C':[1,2,3,4] * n})

    data = simulateDraw(data)

    return data


def forloop(df):

    draw_cols = [col for col in df if col.startswith('draw')]

    for col in draw_cols:

        max_idx = df.groupby(['A', 'B'])[col].idxmax().values

        df.loc[max_idx, col] = 1

        df.loc[~df.index.isin(max_idx), col] = 0

    return df


def applyeq(df):

    draw_cols = [col for col in df if col.startswith('draw')]

    df.update(df.groupby(['A','B'])[draw_cols].apply(lambda x: x.eq(x.max(0))).astype('int'))

    return df



def idxmax(df):

    draw_cols = [col for col in df if col.startswith('draw')]

    max_idx = df.groupby(['A', 'B'])[draw_cols].transform('idxmax')

    max_idx['index'] = max_idx.index.values

    df.update(max_idx.isin(max_idx['index']).astype(int))

    return df



perfplot.show(

    setup=makedata,

    kernels=[idxmax,applyeq,forloop],

    n_range=[2**k for k in range(5,22)],

    xlabel='len(df)'

)


查看完整回答
反對 回復(fù) 2023-10-26
?
守候你守候我

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊

這種嵌套列表理解不需要 groupby,但可以更快地更新值(它取代了對apply lambda應(yīng)用于每個(gè)元素的 ' '的需要np.where)。如果你的規(guī)模很大的話,它可能會(huì)更有效dataframe(盡管我沒有運(yùn)行任何性能指標(biāo)!)


out = pd.concat(

            [

                pd.concat(

                            [

                                pd.DataFrame(

                                                np.where(

                                                            df.loc[df.B.isin([i]),['draw0','draw1','draw2']]==df.loc[df.B.isin([i]),['draw0','draw1','draw2']].max().to_numpy()[None,:],1,0

                                                        )

                                            ).reset_index(drop=True),\

                               df.loc[df.B.isin([i]),['A','B','C']].reset_index(drop=True)

                            ], axis=1, sort=False, ignore_index=True

                        ) for i in df.B.unique()

            ], axis=0, sort=False, ignore_index=True

            )



out.rename(columns = {0:'draw0',1:'draw1',2:'draw2',3:'A',4:'B',5:'C'}, inplace=True)



查看完整回答
反對 回復(fù) 2023-10-26
  • 3 回答
  • 0 關(guān)注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號