如何在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
相关产品推荐
相关产品推荐

