如何在Pandas中按条件应用capitalize字符串函数?
如何在Pandas中按条件应用capitalize字符串函数?
嘿,我来帮你搞定这个问题!你之前的代码没生效,主要是因为链式索引(就是df[df['B']=='Masters']['A']这种写法)在Pandas里很容易触发SettingWithCopyWarning——本质上你可能是在修改一个临时副本,而不是原DataFrame的数据,所以修改根本同步不回去。
下面给你几个靠谱的解决办法:
方法一:用loc直接定位修改(最推荐)
loc是Pandas里精准定位行和列的利器,用它可以直接修改原DataFrame的目标数据,完全不会有副本的问题:
# importing pandas as pd import pandas as pd # 创建示例DataFrame df = pd.DataFrame({ 'A': ['john', 'bODAY', 'minA', 'peter', 'nicky'], 'B': ['Masters', 'Graduate', 'Graduate', 'Masters', 'Graduate'], 'C': [27, 23, 21, 23, 24] }) # 用loc定位符合条件的行和列,应用capitalize df.loc[df['B'] == 'Masters', 'A'] = df.loc[df['B'] == 'Masters', 'A'].str.capitalize()
运行之后,你就能得到想要的结果:只有B列是Masters的行,A列的内容会被正确首字母大写,其他行保持原样。
方法二:用apply结合lambda函数
如果之后你有更复杂的条件逻辑,这种方法会更灵活:
df['A'] = df.apply(lambda x: x['A'].capitalize() if x['B'] == 'Masters' else x['A'], axis=1)
它会逐行遍历DataFrame,判断每行的B列值,符合条件就对A列做capitalize操作,否则直接保留原内容。
方法三:用where方法实现简洁写法
这种写法更紧凑,利用Pandas的向量化操作特性:
df['A'] = df['A'].str.capitalize().where(df['B'] == 'Masters', df['A'])
简单说就是:先对A列所有内容做capitalize,然后只保留B列是Masters的行的修改结果,其他行直接用原A列内容替换回去。
最终效果
不管用哪种方法,最终的DataFrame都会和你预期的一致:
| A | B | C | |
|---|---|---|---|
| 0 | John | Masters | 27 |
| 1 | bODAY | Graduate | 23 |
| 2 | minA | Graduate | 21 |
| 3 | Peter | Masters | 23 |
| 4 | nicky | Graduate | 24 |
备注:内容来源于stack exchange,提问作者Ssong
相关产品推荐
相关产品推荐

