如何测试每行的列值?

时间:2017-10-15 17:02:27

标签: python performance pandas

我有一个包含10列和大约20,000,000行的数据框。 我需要逐行比较10列的值,并使用新值创建五列。为此,我定义了一个由if函数组成的函数,并将其应用于测试每个函数。

例如:

>>> import pandas as pd
>>> df = pd.DataFrame({'a':[1,2,3,4,5], 'b':[11,12,13,14,16], 'c':[21,22,23,24,25], 'd':[31,32,33,34,35])


>>> def cal1(row):
>>>     v1=0
>>>     v2=0
>>>     if 0< row['a'] <2:
>>>         v1=1
>>>     if 11< row['b'] <14:
>>>         v2=1
>>>     return v1+v2


>>> def cal2(row):
>>>     v1=0
>>>     v2=0
>>>     if 2<= row['a'] <4:
>>>         v1=-1
>>>     if 14<= row['b']<=16:
>>>         v2=-1
>>>     return v1+v2    

>>> df['n1'] = df.apply(ca11, axis=1)
>>> df['n2'] = df.apply(cal2, axis=1)

我能够以这种方式得到答案,但我需要五个定义的函数,每个函数都有很长的条件列表。计算太慢了。 (实际数据应在所有10个列上进行测试,至少有10个条件。)

是否有更好的方法来逐行测试每列中的数据?

2 个答案:

答案 0 :(得分:0)

apply()接受多个parametersfuncargs

  

除了数组/系列

之外,传递给函数的位置参数

你可以通过,例如(0, 2, 11, 14)允许更通用的功能为A列评分,(2, 4, 14, 16)为B列评分,依此类推。或者,传入列名称,让函数根据它做出决定。

处理20 M行需要相当大的CPU开销和内存占用。您可能会发现使用csvreader读取要评分的每一行并使用csvwriter发出结果会更高效,并让pandas导入扩充的CSV文件。

答案 1 :(得分:0)

IIUC,您希望为每行分配一致的值。例如,n1可以是012。如果是这种情况,您可以在n1处开始0并添加索引:

df['n1'] = 0

mask1 = df.a.between(0, 2, inclusive=False) 
mask2 = df.b.between(11, 14, inclusive=False)

df.loc[mask1 | mask2, 'n1'] = 1
df.loc[mask1 & mask2, 'n1'] = 2