如何在Python中加速此任务

2024-04-29 02:07:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大熊猫数据框,24'000'000行×6列加索引。 我需要读取第1列中的整数(即=1或2),然后如果第1列=1,则强制第3列中的值为负值,如果第2列=2,则强制为正值。我在Jupyter笔记本中使用以下代码:

for i in range(1000):
    if df.iloc[i,1] == 1:
        df.iloc[i,3] = abs(df.iloc[i,3])*(-1)
    if df.iloc[i,1] == 2:
        df.iloc[i,3] = abs(df.iloc[i,3])

上面的代码只需要2分钟30秒就可以运行1000行。对于2400万行,需要41天才能完成

有点不对。该代码在相当高端的PC上的Jupyter笔记本电脑/Chrome/Windows中运行

熊猫数据帧是使用pd.read_csv创建的,然后按以下方式进行排序和索引:

df.sort_values(by = "My_time_stamp", ascending=True,inplace = True)
df = df.reset_index(drop=True)

数据帧的创建和排序只需要几秒钟。我还有其他的计算要在这个数据帧上执行,所以我显然需要理解我做错了什么


Tags: 数据代码intruedfforif排序
3条回答

np.where

a = np.where(df.iloc[:, 1].to_numpy() == 1, -1, 1)
b = np.abs(df.iloc[:, 3].to_numpy())
df.iloc[:, 3] = a * b

将其矢量化:

df.iloc[:, 3] = df.iloc[:, 3].abs() * (2 * (df.iloc[:, 1] != 1) - 1)

说明:

将布尔级数df.iloc[:, 1] != 1视为int,将其转换为1和0。乘以2,得到2和0。减去1后,得到-1,其中第一列为1,否则为1。最后,它与第三列的绝对值相乘,第三列强制符号

与for循环相比,矢量化通常提供一个数量级或两个加速

使用

df.iloc[:,3] = df.iloc[:,3].abs().mul( df.iloc[:,-1].map({2:1,1:-1}) )

相关问题 更多 >