[問題] Pandas Series 條件-篩選-取代請益

作者: god1230321 (skyrim)   2022-04-27 19:55:17
大家好,
小弟python新手,最近練習pandas時面臨一個問題
懇請大家協助
假設我有一個共A B C D 四欄五列的dataframe 'df',
其中A欄為[20, 39, 41, 85, 11]的隨機數,
現在我想要將A欄中小於40的數+10,大於等於40的數-5,
(同時,所以最終39要變成49,而不是44)
請問該怎麼處理呢?
直覺地想到就是
if df['A'] > 40:
df['A] += 10
...
但很明顯series沒辦法這樣處理。
之前學到的方式,大多是使用新建df的方法處理
df2 = df[df['A'] > 40]
df2['A'] += 10
然而一來是這樣原來的df並沒有更動,而且一次只能用一個條件來篩選,頗為冗長
再來我也不會用新建的series來取代(畢竟長度不同,有這種方法嗎?)
懇請版上各位先進指教了,
該怎麼才能直接修改原來的df,
或是提點有甚麼方向可以去研究的,感謝!
作者: lycantrope (阿寬)   2022-04-27 20:37:00
def myadd(x):return(x+10 if x<40 else x-5)df = df.assign(A=df.A.apply(myadd))
作者: dobedobedo (DoBe)   2022-04-27 21:02:00
試試用 where: https://t.ly/6grQ
作者: Mupzopod (pinballmachine)   2022-04-27 21:51:00
where正確, 不過如果是我會另設一個 df['A_1'] column避免inplace計算新的series直接copy df['A'] 就可以了df.loc[df.A>40, 'A_1']-=5
作者: lycantrope (阿寬)   2022-04-27 23:12:00
要變數mask=df.A<40;df.A[mask]+=10;df.A[~mask]-=5assign會回傳修改後的df並不是inplace,而且可以同時修改多個columns先定義var1後,var1的狀態不會因為後面修改而變動
作者: robert09080 (Aspettarei)   2022-04-29 17:18:00
You can use list comprehension, here we have alist L, L=[20,39,41,85,11], L2=[x+10 if x<40 else x-5 if x>40 else x for x in L], and df[‘B’]=L2
作者: poototo (poototo)   2022-04-30 00:58:00
w = df.A >= 40df['A'] = df.A+w*(-5)+~w*10
作者: gene50814 (genechen)   2022-04-30 12:13:00
df[‘A’] = df.A.map(lambda x:x+10 if x<40 else x-5)

Links booklink

Contact Us: admin [ a t ] ucptt.com