gpt4 book ai didi

python - 避免对 Pandas 进行重复操作

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:31 25 4
gpt4 key购买 nike

源自另一个问题,here

我有一个 200 万行的 DataFrame,类似于这个

final_df = pd.DataFrame.from_dict({
'ts': [0,1,2,3,4,5],
'speed': [5,4,1,4,1,4],
'temp': [9,8,7,8,7,8],
'temp2': [2,2,7,2,7,2],
})

我需要对每一行的值进行计算,并将结果附加为新列,类似于 question in this link .

我知道如果我 drop_duplicates 生成的 DataFrame 只有 50k 行长度,我知道有很多速度、温度和 temp2 的组合会重复,使用这样的应用函数,处理时间要少得多:

def dafunc(row):
row['r1'] = row['speed'] * row['temp1'] * k1
row['r2'] = row['speed'] * row['temp2'] * k2

nodup_df = final_df.drop_duplicates(['speed,','temp1','temp2'])
nodup_df = dodup_df.apply(dafunc,axis=1)

上面的代码是我实际所做的 super 简化。

到目前为止,我正在尝试使用一个字典来存储结果,并且由组合形成的字符串是键,如果字典已经有这些结果,我会获取它们而不是再次进行计算。

是否有使用 Pandas 的矢量化操作更有效的方法?

编辑: 最后,生成的 DataFrame 应该如下所示:

#assuming k1 = 0.5, k2 = 1
resulting_df = pd.DataFrame.from_dict({
'ts': [0,1,2,3,4,5],
'speed': [5,4,1,4,1,4],
'temp': [9,8,7,8,7,8],
'temp2': [2,2,7,2,7,2],
'r1': [22.5,16,3.5,16,3.5,16],
'r2': [10,8,7,8,7,8],
})

最佳答案

好吧,如果您可以根据列索引访问 numpy 数组中的列,那会快很多,即

final_df['r1'] = final_df.values[:,0]*final_df.values[:,1]*k1
final_df['r2'] = final_df.values[:,0]*final_df.values[:,2]*k2

如果您想一次创建多个列,您可以使用 for 循环,速度与

类似
k = [0.5,1]
for i in range(1,3):
final_df['r'+str(i)] = final_df.values[:,0]*final_df.values[:,i]*k[i-1]

如果删除重复项,速度会快得多。

输出:

  speed  temp  temp2  ts    r1    r20      5     9      2   0  22.5  10.01      4     8      2   1  16.0   8.02      1     7      7   2   3.5   7.03      4     8      2   3  16.0   8.04      1     7      7   4   3.5   7.05      4     8      2   5  16.0   8.0

For small dataframe

%%timeit
final_df['r1'] = final_df.values[:,0]*final_df.values[:,1]*k1
final_df['r2'] = final_df.values[:,0]*final_df.values[:,2]*k2

1000 loops, best of 3: 708 µs per loop

对于大型数据框

%%timeit
ndf = pd.concat([final_df]*10000)
ndf['r1'] = ndf.values[:,0]*ndf.values[:,1]*k1
ndf['r2'] = ndf.values[:,0]*ndf.values[:,2]*k2

1 loop, best of 3: 6.19 ms per loop

关于python - 避免对 Pandas 进行重复操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46124758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com