我有一个包含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个条件。)
是否有更好的方法来逐行测试每列中的数据?
答案 0 :(得分:0)
apply()
接受多个parameters:func
和args
,
除了数组/系列
之外,传递给函数的位置参数
你可以通过,例如(0, 2, 11, 14)
允许更通用的功能为A列评分,(2, 4, 14, 16)
为B列评分,依此类推。或者,传入列名称,让函数根据它做出决定。
处理20 M行需要相当大的CPU开销和内存占用。您可能会发现使用csvreader读取要评分的每一行并使用csvwriter发出结果会更高效,并让pandas导入扩充的CSV文件。
答案 1 :(得分:0)
IIUC,您希望为每行分配一致的值。例如,n1
可以是0
,1
或2
。如果是这种情况,您可以在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