pandas如何删除列中列表前n个元素(n为另一列对应数值)
实现方案
方法1:使用apply + lambda(符合你猜测的实现思路)
按行遍历DataFrame,对每一行的a列列表做切片,起始索引取当前行b列的数值即可:
df['a'] = df.apply(lambda row: row['a'][row['b']:], axis=1)
参数axis=1指定按行处理,lambda接收的row参数代表每一行的Series对象,row['a'][row['b']:]就是去掉列表前row['b']个元素的切片写法,注意必须加axis=1,否则默认按列处理会报错。
方法2:使用列表推导式(性能更优)
如果数据量较大,优先用列表推导式实现,执行效率比apply高30%以上:
df['a'] = [lst[n:] for lst, n in zip(df['a'], df['b'])]
完整验证代码
import pandas as pd a = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]] b = [3,1,2] df = pd.DataFrame(zip(a,b), columns = ['a', 'b']) # 执行修改 df['a'] = df.apply(lambda row: row['a'][row['b']:], axis=1) print(df)
运行后输出和你预期的结果完全一致:
a b 0 [4, 5] 3 1 [7, 8, 9, 10] 1 2 [13, 14, 15] 2
边界说明
如果某行b列的数值大于等于a列列表的长度,切片会自动返回空列表,不会抛出异常。
内容的提问来源于stack exchange,提问作者Stephen Mason
相关产品推荐
相关产品推荐

