You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按顺序创建指定前缀列的DataFrame子集?解决赋值失效问题

解决Pandas循环赋值后DataFrame子集为空的问题

问题原因

你原来的代码中,subsets=[df1, df2]存储的是对初始空DataFrame对象的引用,但在循环里执行subset=df[subcol]时,只是将局部变量subset重新指向了新生成的DataFrame,并没有修改原列表subsets中的元素,也不会改变df1、df2原本的引用指向。因此循环结束后,df1和df2仍然是空的DataFrame。

修正方案

方案一:用字典存储结果后赋值

这种方法清晰直观,适合后续扩展更多子集的场景:

import pandas as pd

data = {'radius_mean':[18, 21, 20, 11, 20],
        'radius_se':[1, 0.5, 0.7, 0.4, 0.8],
       'area_mean': [1001, 1326, 1203, 386, 1200],
       'area_se': [153, 75, 94, 27, 95]}
df=pd.DataFrame(data)

subsets = {}
features=['radius', 'area']
for feature in features:  
    subcol = [col for col in df.columns if col.startswith(f"{feature}_")]
    subsets[feature] = df[subcol]

df1 = subsets['radius']
df2 = subsets['area']

print("df1:\n", df1)
print("\ndf2:\n", df2)

方案二:通过索引修改列表元素

直接操作列表的索引,修改列表中对应位置的元素,从而同步更新df1、df2:

import pandas as pd

data = {'radius_mean':[18, 21, 20, 11, 20],
        'radius_se':[1, 0.5, 0.7, 0.4, 0.8],
       'area_mean': [1001, 1326, 1203, 386, 1200],
       'area_se': [153, 75, 94, 27, 95]}
df=pd.DataFrame(data)

subsets = [pd.DataFrame(), pd.DataFrame()]
features=['radius', 'area']
for idx, feature in enumerate(features):  
    subcol = [col for col in df.columns if col.startswith(f"{feature}_")]
    subsets[idx] = df[subcol]

df1, df2 = subsets

print("df1:\n", df1)
print("\ndf2:\n", df2)

方案三:直接生成子集(适合少量子集场景)

如果只需要生成两个子集,直接分别定义更简洁:

import pandas as pd

data = {'radius_mean':[18, 21, 20, 11, 20],
        'radius_se':[1, 0.5, 0.7, 0.4, 0.8],
       'area_mean': [1001, 1326, 1203, 386, 1200],
       'area_se': [153, 75, 94, 27, 95]}
df=pd.DataFrame(data)

df1 = df[[col for col in df.columns if col.startswith('radius_')]]
df2 = df[[col for col in df.columns if col.startswith('area_')]]

print("df1:\n", df1)
print("\ndf2:\n", df2)

内容的提问来源于stack exchange,提问作者Sunny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:15:37