我正在处理一个大型数据集,并且需要将某些列合并到一个列表中。挑战在于,选择的列数要取决于另一个键值,该键值对于每一行都是不同的。
Key Col1 Col2 Col3 Col4 Col5 NonrelatedCols
1 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 NonrelatedCols
1 [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]]
总而言之,有没有一种方法可以简化代码,所以我不需要遍历所有行?
答案 0 :(得分:2)
仅考虑重要的列:
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
的{{1}}函数将对除第一列(list
)之外的所有Col
感兴趣的列起作用,然后根据{{1}}中的值为列表编制索引:
Key
Key
是df.apply(lambda x : list(x[1:])[:x[0]], axis=1)
Key
不是int
,请使用Key
输出:
int
答案 1 :(得分:1)
尝试:
df.apply(lambda x: x[1:x.Key+1].tolist(), axis=1)
输出:
0 [a]
1 [r, b, x]
2 [k, d]
3 []
dtype: object