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/cn.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灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP