我有一个Pandas数据帧,我想根据其他列的值添加新列。下面是一个说明我的用例的最小示例。
注意:原始数据框包含约4百万行和6列。样本中的行数可能在50到500之间变化。我正在一台8 GB RAM的64位机器上运行。
以上方法可行,但速度相对较慢(我的情况需要大约15秒)。我还尝试使用x.itertuples()代替apply,但在这种情况下几乎没有改善。
以下是需要解决的问题:
1.看起来apply(使用axis = 1)很慢,因为它没有利用向量化操作。有没有更快的方法?
2.与使用条件布尔变量相比,能否修改或使筛选(在get_new函数中)更有效?
3.我能在某种程度上使用numpy来加速吗?
编辑:df.sample()也非常慢,而且我不能使用.iloc或.loc,因为我还要修改样本,并且不希望影响原始数据框。
df = pd.DataFrame([[4,5,19],[1,2,0],[2,5,9],[8,2,5]], columns=['a','b','c'])
df
a b c
---------------
0 4 5 19
1 1 2 0
2 2 5 9
3 8 2 5
x = df.sample(n=2)
x
a b c
---------------
3 8 2 5
1 1 2 0
def get_new(row):
a, b, c = row
return random.choice(df[(df['a'] != a) & (df['b'] == b) & (df['c'] != c)]['c'].values)
y = x.apply(lambda row: get_new(row), axis=1)
x['new'] = y
x
a b c new
--------------------
3 8 2 5 0
1 1 2 0 5
注意:原始数据框包含约4百万行和6列。样本中的行数可能在50到500之间变化。我正在一台8 GB RAM的64位机器上运行。
以上方法可行,但速度相对较慢(我的情况需要大约15秒)。我还尝试使用x.itertuples()代替apply,但在这种情况下几乎没有改善。
以下是需要解决的问题:
1.看起来apply(使用axis = 1)很慢,因为它没有利用向量化操作。有没有更快的方法?
2.与使用条件布尔变量相比,能否修改或使筛选(在get_new函数中)更有效?
3.我能在某种程度上使用numpy来加速吗?
编辑:df.sample()也非常慢,而且我不能使用.iloc或.loc,因为我还要修改样本,并且不希望影响原始数据框。