如何为DataFrame指定索引选择性应用computeLeft函数
解决方案
场景1:指定行的位置索引(从0开始的序号)
如果[2, 5, 7, 8, 10]是DataFrame的行位置(比如第3行、第6行的位置序号),可以按以下步骤实现:
- 先初始化结果列为NaN:
import numpy as np import pandas as pd results = ["val1", "val2", "val3", "val4"] # 给所有行的结果列赋初始值NaN df[results] = np.nan
- 针对指定位置计算并赋值:
target_positions = [2, 5, 7, 8, 10] # 对指定位置的索引调用computeLeft computed_values = np.vectorize(computeLeft, signature="()->(4)")(target_positions) # 将计算结果赋值到对应行 df.loc[df.index[target_positions], results] = computed_values
场景2:指定行的索引标签
如果[2, 5, 7, 8, 10]是DataFrame的实际索引标签(比如df的索引就是这类数值),分两种情况处理:
情况A:computeLeft接收的是行位置序号
需要先把索引标签转换成对应的行位置:
import numpy as np import pandas as pd results = ["val1", "val2", "val3", "val4"] df[results] = np.nan target_labels = [2, 5, 7, 8, 10] # 获取标签对应的行位置 positions = df.index.get_indexer(target_labels) # 计算对应值 computed_values = np.vectorize(computeLeft, signature="()->(4)")(positions) # 赋值到对应标签的行 df.loc[target_labels, results] = computed_values
情况B:computeLeft接收的是索引标签(而非行位置)
直接用标签调用函数即可:
import numpy as np import pandas as pd results = ["val1", "val2", "val3", "val4"] df[results] = np.nan target_labels = [2, 5, 7, 8, 10] computed_values = np.vectorize(computeLeft, signature="()->(4)")(target_labels) df.loc[target_labels, results] = computed_values
注意事项
- 用
np.nan初始化会让结果列变为浮点类型,若需保留整数类型,可改用pd.NA(需pandas 1.0及以上版本)。 - 上述方案延续了你原代码中
np.vectorize的使用逻辑,确保计算逻辑和格式的一致性。
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

