簡體   English   中英

Pandas Dataframe 以給定的間隔更改列值

[英]Pandas Dataframe change column values with given interval

我正在嘗試根據間隔轉換我的列值,例如,

if(x<5)
  x=2
else if(x>=5 %% x<10)
  x=3

並嘗試使用單行代碼在 python 中進行操作。 使用蒙版和剪切方法,但我做不到。 這是我的審判,

dataset['CURRENT_RATIO' ] = dataset['CURRENT_RATIO'].mask((dataset['CURRENT_RATIO'] < 0.02, -7.0) | (dataset['CURRENT_RATIO'] > =0.02 & dataset['CURRENT_RATIO'] < 0.37),-5))

if x<0.02 then -7 else if x>=0.02 and x<0.37 then -5...

  inptut output
    0.015  -7
    0.02   -5
    0.37   -3
    0.75   1

TL;博士

列表理解將執行以下操作:

dataset.CURRENT_RATIO = [-7 if i<.02 else -5 if i<.37 else -3 if i<.75 else 1 for i in dataset.CURRENT_RATIO]

使用 1,000,000 行的隨機數據集對其進行計時,得到以下結果:

334 ms ± 5.89 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

多列

如果您要對具有不同閾值和更新值的多個列執行此操作,我將執行以下操作:

df = pd.DataFrame({'RATIO1': np.random.rand(10000000),
                   'RATIO2': np.random.rand(10000000)})

update_per_col = {'RATIO1': [(.02, -7), (.37, -5), (.75, -3), 1],
                  'RATIO2': [(.12, 5), (.47, 6), (.85, 7), 8]}
cols_to_be_updated = ['RATIO1', 'RATIO1']

for col in cols_to_be_updated:
    df[col] = [update_per_col[col][0][1] if i<update_per_col[col][0][0] else 
               update_per_col[col][1][1] if i<update_per_col[col][1][0] else 
               update_per_col[col][2][1] if i<update_per_col[col][2][0] else update_per_col[col][3]
               for i in df[col]]

當我們用 10,000,000 行和兩列來計時 for 循環時,我們得到:

9.37 s ± 147 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

為了解決 Joe Ferndz 的評論,讓我們嘗試加快速度。 我想出了兩種方法: apply()lambda 使用apply()我們運行以下代碼(只有 for 循環是定時的):

def update_ratio(x, updates):
    if x < updates[0][0]:
        return updates[0][1]
    elif x < updates[1][0]:
        return updates[1][1]
    elif x < updates[2][0]:
        return updates[2][1]
    else:
        return updates[3]

for col in cols_to_be_updated:
    df[col] = df[col].apply(update_ratio, updates=update_per_col[col])

這給了我們:

11.8 s ± 285 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

最后lambda給出:

for col in cols_to_be_updated:
    df[col] = df[col].apply(lambda x: update_per_col[col][0][1] if x<update_per_col[col][0][0] else 
              update_per_col[col][1][1] if x<update_per_col[col][1][0] else 
              update_per_col[col][2][1] if x<update_per_col[col][2][0] else 
              update_per_col[col][3])

8.91 s ± 171 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

這意味着 lambda 是最快的方法,但列表理解並不遙遠。

利用

dataset['CURRENT_RATIO'][dataset['CURRENT_RATIO']<10]=3
dataset['CURRENT_RATIO'][dataset['CURRENT_RATIO']<5]=2

第一行您將所有小於 10 的值設為 3,然后將所有小於 5 的值設為 2 它使 5 到 10 之間的所有值保持為 3

編寫自己的lambda函數並使用pandas.apply()會很聰明

def my_lambda(x):
    if(x<5):
        x=2
    elif(x<10):
        x=3
    return x

dataset['CURRENT_RATIO' ] = dataset['CURRENT_RATIO'].apply(my_lambda)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM