【问题标题】:Arithmetic operations on large dataframe大型数据帧上的算术运算
【发布时间】:2021-12-12 08:57:33
【问题描述】:

如果这不是一个好问题,请提前道歉,我是 DataFrames 的初学者...

我有一个大型数据框(大约有数千行和 5000 多列)。

前 5000 列包含数字,我需要根据其他列的值对这些数字中的每一个进行一些操作。

例如,将一行中的前 5000 个数字与同一行中另一列的值相乘。

Index 1 2 3 4 ... 5000 a b c d
0 0.1 0.4 0.8 0.6 ... 0.3 3 7 2 9
1 0.7 0.5 0.4 0.8 ... 0.1 4 6 1 3
... ... ... ... ... ... ... ... ... ... ...
1000 0.2 0.5 0.1 0.9 ... 0.6 6 8 5 4

这是一个代码示例,它将我的数字乘以列“a”,然后乘以一个常数,然后得到它的指数:

a_col = df.get_loc("a")
            
df.iloc[: , : 5000 ] = np.exp (df.iloc[: ,  : 5000 ] * df.iloc[: , [a_col]].to_numpy() * np.sqrt(4) )

虽然结果看起来不错,但确实感觉很慢,尤其是与我尝试替换的代码相比,即在循环中逐行执行这些操作。

这是完成我想要实现的目标的正确方法,还是我做错了什么?

感谢您的帮助!

【问题讨论】:

  • 您的代码对我不起作用。 get_col 是什么?
  • 你的意思是 get_loc 吗?是获取“a”的列号。
  • 是的对不起,我的意思是get_col。我有一个名为df 的普通(pandas 版本 1.3.4)DataFrame,df.get_loc("a") 表示'DataFrame' object has no attribute 'get_loc'。我改为df["a"]
  • 我不确定我是否完全理解您要做什么,但请参阅下面的答案。考虑到数据的大小,速度非常快 (5k * 1k = 1m)

标签: pandas dataframe


【解决方案1】:

使用.values 方法获取numpy 数组,np.newaxis 使df.a 成为列向量并逐行相乘:

df.iloc[: , : 5000 ] = np.exp(df.iloc[: ,  : 5000 ].values * df.a.values[:, np.newaxis] * np.sqrt(4) )

【讨论】:

    【解决方案2】:

    试试这个:

    df.iloc[:, :5000] = np.exp(df.iloc[:, :5000].values * a_col.to_numpy().reshape(-1,1) * np.sqrt(4))
    

    运行只需几秒钟(对于 500 万个单元)。

    如果它有效,我会解释它:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      相关资源
      最近更新 更多