我有一个包含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行),并且持续时间很长。有没有更快的解决方案?
答案 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)