在Python中将20列汇总为1的更快方法

时间:2019-03-18 12:13:37

标签: python pandas dataframe

我有一个包含20列的数据框,每列中有0或1。如果我的20列中的任何一列为1,那么我想有一个新列为1,否则为0。

我试图这样做:

df['new_column'] = df.apply(lambda x: np.sign(sum(x[['s2', 's3', 's4', 's5', 
's6', 's7', 'k1', 'k2', 'k3', 'k4','k5', 'k6', 'k7', 'n1', 'n2', 'n3', 
'n4','n5', 'n6', 'n7']])), axis=1) 

但是我的df很大(〜5000000行),并且持续时间很长。有没有更快的解决方案?

3 个答案:

答案 0 :(得分:4)

是的,apply是幕后的循环,因此请按列列表选择列,按DataFrame.values将DataFrame转换为2d numpy数组,强制转换为bool并获得{{1} }向量化解决方案的每行:

any

或者:

L = ['s2', 's3', 's4', 's5','s6', 's7', 
     'k1', 'k2', 'k3', 'k4','k5', 'k6', 'k7', 
     'n1', 'n2', 'n3', 'n4','n5', 'n6', 'n7']

df['new_column'] = np.any(df[L].values.astype(bool), axis=1)

性能

df['new_column'] = df[L].values.sum(axis=1).astype(bool)

答案 1 :(得分:1)

另一种可能的解决方案:

df['new_column'] = df.apply(lambda x: 1 if sum(x) > 0 else 0, axis =1)

答案 2 :(得分:0)

假设只能有0或1个值

import numpy as np

df['newcol'] = df.apply(lambda x: np.max(x), axis=1)