我正在处理一个大型数据集,需要将某些列组合成一个列表。挑战在于,选择的列数取决于另一个键值,每行都不同。例子:原始数据集:Key Col1 Col2 Col3 Col4 Col5 NonrelatedCols1 a b c d e ...3 r b x d c ...2 k d q l w ...0 w a c s w ...预期结果:Key List NonrelatedCols1 [a] ...3 [r,b,x] ...2 [k,d] ...0 [] ...主要挑战在于代码的性能。遍历行,不是最佳方法,我正在寻找一种更有效的方法。我试图只选择目标列,然后使用该agg(list,axis=1)功能。问题是,没有办法根据键值聚合列。看来,我仍然必须对所有行进行迭代,然后在组合列中删除过多的值Cols = ['Col1', 'Col2', 'Col3','Col4','Col5']CombinedList = rawData[Cols].agg(list,axis=1)for i in range(rawData.shape[0]): CombinedList[i]=CombinedList[i][:rawData['Key'][i]]总结一下,有没有办法简化代码,所以我不需要遍历所有行?
2 回答

尚方宝剑之说
TA贡献1788条经验 获得超4个赞
只考虑重要的列:
Key Col1 Col2 Col3 Col4 Col5
0 1 a b c d e
1 3 r b x d c
2 2 k d q l w
3 0 w a c s w
假设Key总是在第一列,apply该list函数Col对除第一列以外的所有感兴趣的列 ( Key),然后根据 中的值对列表进行索引Key:
df.apply(lambda x : list(x[1:])[:x[0]], axis=1)
这需要Key是一个int
如果Key不是int,则使用df = df.astype({'Key': 'int32'})
输出:
0 [a]
1 [r, b, x]
2 [k, d]
3 []

哆啦的时光机
TA贡献1779条经验 获得超6个赞
尝试:
df.apply(lambda x: x[1:x.Key+1].tolist(), axis=1)
输出:
0 [a]
1 [r, b, x]
2 [k, d]
3 []
dtype: object
添加回答
举报
0/150
提交
取消