Python 如何为每行测试列的值?

Python 如何为每行测试列的值?,python,performance,pandas,Python,Performance,Pandas,我有一个数据框,有10列,大约20000000行。 我需要逐行比较10列的值,并用新值创建5列。为此,我定义了一个由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]) >>> d

我有一个数据框,有10列,大约20000000行。 我需要逐行比较10列的值,并用新值创建5列。为此,我定义了一个由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)
>>将熊猫作为pd导入
>>>数据帧({'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(世界其他地区):
>>>v1=0
>>>v2=0
>>>如果0>v1=1
>>>如果11>v2=1
>>>返回v1+v2
>>>def cal2(世界其他地区):
>>>v1=0
>>>v2=0
>>>如果2>v1=-1
>>>如果14>v2=-1
>>>返回v1+v2
>>>df['n1']=df.apply(ca11,轴=1)
>>>df['n2']=df.apply(计算2,轴=1)
我可以通过这种方式得到答案,但我需要五个定义的函数,每个函数都有一长串的条件,而且计算速度太慢。 (实际数据应在所有10列上进行测试,至少有10个条件。)

有没有比这更好的方法来逐行测试每列中的数据?

apply()
接受几个:
func
args
,它们是

除了数组/系列之外,还要传递给函数的位置参数

您可以传入例如
(0、2、11、14)
以允许更通用的函数对a列进行评分,
(2、4、14、16)
对B列进行评分,等等。或者,传入列名并让函数基于此做出决定


处理2000万行需要相当大的CPU开销和内存占用。您可能会发现,使用a读取要评分的每一行,并使用csvwriter发出结果,然后让pandas导入增强的CSV文件更有效。

IIUC,您希望为每一行分配一致的值。例如,
n1
是eit她的
0
1
2
。如果是这种情况,您可以从
0
开始
n1
,然后添加索引:

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