如何为Pandas DataFrame的随机子集设置指定列的值?
解决Pandas随机子集列赋值不生效的问题
嘿,这个问题我之前也碰到过!你之所以没法成功修改原DataFrame的group列值,核心原因是**链式索引(Chained Indexing)**在搞鬼——你写的df.sample(2)['group'] = 'experimental'或者df.iloc[[0,1]]['group'] = 'experimental',其实都是在修改一个临时生成的副本,而不是原DataFrame本身,所以修改完原数据根本没变化。
正确的解决方法
这里给你两种靠谱的实现方式,都是直接对原DataFrame进行修改:
方法1:针对随机选取样本的场景
先获取随机样本的索引,再用loc直接定位行和列进行赋值:
# 先抽取2个随机样本,获取它们的索引 random_rows = df.sample(2) # 通过索引直接修改原df的group列 df.loc[random_rows.index, 'group'] = 'experimental'
或者更简洁的写法:
df.loc[df.sample(2).index, 'group'] = 'experimental'
方法2:针对指定行位置的场景
如果你是明确要修改第0、1行,直接用loc同时指定行和列(推荐),或者用iloc结合列的位置索引:
# 用loc直接定位行和列名(最直观) df.loc[[0, 1], 'group'] = 'experimental' # 或者用iloc,先获取group列的位置索引 group_col_idx = df.columns.get_loc('group') df.iloc[[0, 1], group_col_idx] = 'experimental'
为什么原来的方法不生效?
当你使用链式索引(比如先sample()再取列,或者先iloc再取列)时,Pandas无法确定返回的是原数据的视图还是副本。这种情况下,赋值操作只会作用在那个临时的中间对象上,原DataFrame完全不会被修改,如果你打开了Pandas的警告,还会看到SettingWithCopyWarning提示你这个风险。
修改后示例结果
执行正确的代码后,你的DataFrame会变成这样:
species name group 0 platypus mike experimental 1 monkey paul experimental 2 possum doug control
内容的提问来源于stack exchange,提问作者Nicolas Gervais
相关产品推荐
相关产品推荐

