Python 板


LINE

大家好, 小弟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, 或是提點有甚麼方向可以去研究的,感謝! --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.43.4.144 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Python/M.1651060519.A.576.html
1F:推 lycantrope: def myadd(x):return(x+10 if x<40 else x-5) 04/27 20:37
2F:→ lycantrope: df = df.assign(A=df.A.apply(myadd)) 04/27 20:37
3F:→ dobedobedo: 試試用 where: https://t.ly/6grQ 04/27 21:02
4F:推 Mupzopod: where正確, 不過如果是我會另設一個 df['A_1'] column 04/27 21:51
5F:→ Mupzopod: 避免inplace計算 04/27 21:51
6F:→ Mupzopod: 新的series直接copy df['A'] 就可以了 04/27 21:54
7F:→ Mupzopod: df.loc[df.A>40, 'A_1']-=5 04/27 21:57
8F:推 lycantrope: 要變數mask=df.A<40;df.A[mask]+=10;df.A[~mask]-=5 04/27 23:12
感謝大家! 剛剛把這些辦法都試了一遍,獲益匪淺 首先是自定義 def myAdd(x): return x+10 if x<40 else x-5 df = df.assign(A = df.A.apply(myAdd)) print(df) 但我發現直接粗暴取代好像也可以? df['A'] = df.A.apply(myAdd) 請問這樣會有甚麼差別嗎? ----------------- 再來是where df['A'] = np.where(var1, df.A+10, df.A-5) print(df) 原本嘗試用pd.df.where的,結果寫不出來Orz df.where(df.A < 40, df-5, inplace = True) 這樣會連其他欄一起更改,但當我想限制只有A欄時 df.where(df.A < 40, df.A-5, axis = 0, inplace = True) 會把其他欄也改成跟A欄一樣Orz e.g. A B C A B C 0 43 17 79 >> 0 38 38 38 QQ... ----------------- 最後不論是用loc還是直接指定 var1 = df['A'] < 40 df['A'][var1] += 10 df['A'][~var1] -= 5 df['A1'] = df.A df.loc[var1, 'A1'] += 10 df.loc[~var1, 'A1'] -= 5 都能達到目標,反而讓我有點好奇 會甚麼這樣分兩行來寫,新條件不會覆蓋到舊條件上呢? (38最終會變48,而不是38>48>43這樣) 總之,感謝各位! ※ 編輯: god1230321 (59.124.123.10 臺灣), 04/28/2022 10:39:38
9F:推 lycantrope: assign會回傳修改後的df並不是inplace,而且可以同時 04/28 10:46
10F:→ lycantrope: 修改多個columns 04/28 10:46
11F:→ lycantrope: 先定義var1後,var1的狀態不會因為後面修改而變動 04/28 10:49
喔喔喔原來 剛剛把var1拿掉直接換成df['A'] < 40 條件就會互相影響了,感謝說明 ※ 編輯: god1230321 (59.124.123.10 臺灣), 04/28/2022 11:00:34
12F:推 robert09080: You can use list comprehension, here we have a 04/29 17:18
13F:→ robert09080: list L, L=[20,39,41,85,11], L2=[x+10 if x<40 el 04/29 17:18
14F:→ robert09080: se x-5 if x>40 else x for x in L], and df[‘B’ 04/29 17:18
15F:→ robert09080: ]=L2 04/29 17:18
16F:推 poototo: w = df.A >= 40 04/30 00:58
17F:→ poototo: df['A'] = df.A+w*(-5)+~w*10 04/30 00:58
18F:推 gene50814: df[‘A’] = df.A.map(lambda x:x+10 if x<40 else x-5 04/30 12:13
19F:→ gene50814: ) 04/30 12:13







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP