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

如何在DataFrame部分行中通过apply为多列赋值?

问题原因与解决方案

问题根源

你的代码赋值后出现全NaN的原因是列名不匹配导致的索引对齐问题:

  • my_f返回的Series默认使用数字索引(0、1),调用apply后生成的临时DataFrame列名为0、1;
  • 而你要赋值的目标列是C1、C2,Pandas赋值时会严格按列名对齐,找不到匹配列就会填充NaN。

解决方法

方法1:修改函数返回带指定索引的Series

让my_f返回的Series直接使用目标列名作为索引,这样apply生成的临时DataFrame列名会和目标列完全匹配:

df_test = pd.DataFrame([{'C3':1}, {'C3': 2}, {'C3': 3}, {'C3': 4}, {'C3': 5}, {'C3': 6}])

def my_f(s):
    # 指定Series的索引为目标列名
    return pd.Series(['V1', 'V2'], index=['C1', 'C2'])

# 分批次赋值
df_test.loc[0:1, ['C1','C2']] = df_test.loc[0:1, 'C3'].apply(my_f)
df_test.loc[3:4, ['C1','C2']] = df_test.loc[3:4, 'C3'].apply(my_f)

方法2:保留原函数,重命名临时DataFrame的列

如果不想修改my_f,可以在apply后将临时DataFrame的列重命名为目标列名,再执行赋值:

df_test = pd.DataFrame([{'C3':1}, {'C3': 2}, {'C3': 3}, {'C3': 4}, {'C3': 5}, {'C3': 6}])

def my_f(s):
    return pd.Series(['V1', 'V2'])

# 分批次处理:先生成临时数据并重命名列,再赋值
temp_df = df_test.loc[0:1, 'C3'].apply(my_f).rename(columns={0:'C1', 1:'C2'})
df_test.loc[0:1, ['C1','C2']] = temp_df

temp_df = df_test.loc[3:4, 'C3'].apply(my_f).rename(columns={0:'C1', 1:'C2'})
df_test.loc[3:4, ['C1','C2']] = temp_df

关于大DataFrame的内存优化

两种方法都支持分批次处理(比如按行切片0:20、21:40等),每次仅处理小部分行,不会一次性加载全量数据,能有效避免内存溢出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:57:42