如何基于索引和列,用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
相关产品推荐
相关产品推荐

