如何利用DataFrame列作为索引提取列表列元素并与其他列运算生成新列
问题描述
现有一个多列DataFrame,要用到其中三列:一列是不同长度的列表,另外两列都是单数值列。需求是生成新列,逻辑是用其中一列做列表列的索引,取出对应元素后和该行另一列的数值相乘。
样本数据示例:
df['actual']:1, 4, 3, 6, 4, 7, 2...df['relative track']:2, 0, 1, 5, 3, 4...df['weights']:[250,320,250,320], [250,250,500,500,250], [250,300,300]...
目前尝试的代码有问题,想把循环里的i换成relative_track列作为索引:
#Create relative weight variable df['relative_weigth'] = df['weights'].map(lambda x: i*df['actual'] for i in x)
解决方法
你写的代码问题出在map只单独处理weights列,没法同时获取同一行的relative track和actual值。应该用apply方法,它能一次性访问整行的所有列数据:
正确代码
# 生成relative_weight列 df['relative_weight'] = df.apply( lambda row: row['weights'][row['relative track']] * row['actual'], axis=1 )
代码说明
axis=1参数指定按行处理每一条数据- 对每一行,先通过
row['relative track']的数值作为索引,从row['weights']列表里取出对应元素 - 再把取出的元素和同一行的
row['actual']相乘,得到最终结果
额外提示
如果relative track的数值超过对应weights列表的索引范围(比如某行weights只有3个元素,但relative track是5),会触发索引错误。可以加个异常处理避免程序崩溃:
def calculate_relative_weight(row): try: return row['weights'][row['relative track']] * row['actual'] except IndexError: return None # 也可以返回0或者其他你需要的默认值 df['relative_weight'] = df.apply(calculate_relative_weight, axis=1)
内容的提问来源于stack exchange,提问作者Teko JR
相关产品推荐
相关产品推荐

