如何在Pandas中利用行索引值结合现有列生成新列?
基于Pandas多级索引与列值生成新列的方法
先看你创建DataFrame的代码:
from itertools import product import pandas as pd from random import randint idx = list(product([1,2,3],repeat=2)) index = pd.MultiIndex.from_tuples(idx, names=["x","y"]) df = pd.DataFrame(index=index, columns=["data1"], data=[randint(1,100) for _ in range(9)])
对应的表格如下:
| x | y | data1 |
|---|---|---|
| 1 | 1 | 34 |
| 1 | 2 | 45 |
| 1 | 3 | 23 |
| 2 | 1 | 7 |
| 2 | 2 | 8 |
| 2 | 3 | 41 |
| 3 | 1 | 58 |
| 3 | 2 | 43 |
| 3 | 3 | 9 |
你想要基于索引的x、y值和data1列计算生成新列,你的示例代码存在语法错误,下面是修正后的可行方案,同时提供更高效的向量化实现:
方法1:修正apply写法
你的示例函数括号不匹配,且多级索引访问方式有误,正确的apply写法如下:
def calculate(v): return (v.name[0] + v.name[1]) * v["data1"] df["new_col"] = df.apply(calculate, axis=1)
这里v.name是当前行的多级索引元组,通过索引0、1分别获取x和y的值,修正括号后即可正确计算。
方法2:向量化实现(推荐)
apply处理大数据集时效率较低,更推荐用向量化操作,直接提取索引的x、y级别计算:
df["new_col"] = (df.index.get_level_values("x") + df.index.get_level_values("y")) * df["data1"]
这种方式无需遍历每一行,性能远高于apply,适合大规模数据处理。
执行后,DataFrame会新增new_col列,以你的示例数据为例,结果如下:
| x | y | data1 | new_col |
|---|---|---|---|
| 1 | 1 | 34 | 68 |
| 1 | 2 | 45 | 135 |
| 1 | 3 | 23 | 92 |
| 2 | 1 | 7 | 21 |
| 2 | 2 | 8 | 32 |
| 2 | 3 | 41 | 205 |
| 3 | 1 | 58 | 232 |
| 3 | 2 | 43 | 215 |
| 3 | 3 | 9 | 54 |
内容的提问来源于stack exchange,提问作者Jan Sakalos
相关产品推荐
相关产品推荐

