考虑如下数据帧:
data = {
'lists': [[0, 1, 2],[3, 4, 5],[6, 7, 8]],
'indexes': [0, 1, 2]
}
df = pd.DataFrame(data=data)
lists indexes
0 [0, 1, 2] 0
1 [3, 4, 5] 1
2 [6, 7, 8] 2
我想创建一个新的列'extracted_value',这将是包含在'indexes'索引列表中的值(list = [0,1,2], indexes = 0 ->0,索引= 1 ->1,依此类推)
lists indexes extracted_values
0 [0, 1, 2] 0 0
1 [3, 4, 5] 1 4
2 [6, 7, 8] 2 8
使用iterrows()执行此操作非常慢,因为我要处理包含数百万行的数据帧。
我已经试过了:
df['extracted_value'] = df['lists'][df['indexes']]
但是结果是:
lists indexes extracted_value
0 [0, 1, 2] 0 [0, 1, 2]
1 [3, 4, 5] 1 [3, 4, 5]
2 [6, 7, 8] 2 [6, 7, 8]
下面的命令只会产生包含整个列表的extracted_value:
df['extracted_value'] = df['lists'][0]
谢谢你的帮助。
您所尝试的几乎是ok的,您只需要将其放入pd.DataFrame.apply
,同时将axis
参数设置为1,以确保该函数应用于每一行:
df['extracted_values'] = df.apply(lambda x: x['lists'][x['indexes']], axis=1)
df
lists indexes extracted_values
0 [0, 1, 2] 0 0
1 [3, 4, 5] 1 4
2 [6, 7, 8] 2 8