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

如何基于索引和列,用apply方法填充空DataFrame(无需列表推导式)

使用apply方法填充空DataFrame(无需列表推导式)?

已知需求是创建空DataFrame,并用接收单元格索引与列名的函数填充单元格。现有空DataFrame定义如下:

columns = (1, 2, 3)
index =  (1, 3, 5)
def func(i, j):
  return i + j
df = pd.DataFrame(columns=columns, index=index)

初始状态:

1   2   3
1   NaN NaN NaN
3   NaN NaN NaN
5   NaN NaN NaN

是否可以使用类似df.apply( WHAT???? )的方法填充该DataFrame,且无需使用列表推导式?


可以实现,以下是几种基于apply系列方法的解决方案:

方法1:对行应用apply遍历列计算

df = df.apply(lambda row: pd.Series(
    [func(col, row.name) for col in df.columns], 
    index=df.columns
), axis=1)

说明:axis=1指定对每一行执行操作,row.name获取当前行的索引值,遍历所有列名调用func(col, 行索引)计算每个单元格的值,再转为Series赋值给该行。

方法2:结合stack+apply+unstack(无嵌套推导)

如果完全不想用列表推导,可通过重塑DataFrame结构实现:

df = df.stack().apply(lambda x: func(x.name[1], x.name[0])).unstack()

说明:stack()将列转为内层索引,每个单元格的索引变为(行索引, 列名);apply中通过x.name获取这两个值,传入func计算;最后unstack()还原为原DataFrame结构。

补充:更高效的非apply替代方案

如果不局限于apply,直接生成目标DataFrame的效率会更高:

df = pd.DataFrame(
    map(lambda idx: map(lambda col: func(col, idx), columns), index),
    columns=columns, index=index
)

这里用map替代列表推导,同样避免了先创建空DataFrame再填充的步骤。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 05:23:35