【问题标题】:How to read pandas efficiently, with array of columns names如何使用列名数组有效地读取熊猫
【发布时间】:2021-06-12 23:28:30
【问题描述】:
df = pd.DataFrame({"col_a": [1,2,3], "col_b": [5,4,0], "col_c": [9,7,6])
cols = [["col_a", "col_b"],["col_c", "col_b"],["col_a", "col_b"]]

#expected output:[[1,5],[7,4],[3,0]]

我知道这可以使用列表理解来实现,因为我有超过百万条记录,所以我正在寻找更有效的方法

【问题讨论】:

  • 因此循环超过 100 万条记录大约需要 1 秒。你需要重复运行这个吗?
  • 你能更明确地说明你想要做什么吗?甚至可能显示列表理解。我猜测你是zipping 虽然colsdf 的行,并使用它从df 的连续行中选择值。

标签: python pandas dataframe numpy vectorization


【解决方案1】:

您忘记提供的列表理解:

In [27]: [row[1][col].to_list() for row, col in zip(df.iterrows(), cols)]
Out[27]: [[1, 5], [7, 4], [3, 0]]

【讨论】:

    【解决方案2】:

    如果不迭代 cols 变量,我认为您将无法做到这一点。试试这个 -

    [df.loc[i,j].tolist() for i,j in enumerate(cols)]
    
    [[1, 5], [7, 4], [3, 0]]
    

    【讨论】:

      【解决方案3】:

      您可以将标签映射到索引,然后 take_along_axis

      d = {c: i for i,c in enumerate(df.columns)}
      idx = pd.DataFrame(cols).replace(d).to_numpy()
      #array([[0, 1],
      #       [2, 1],
      #       [0, 1]])
      
      np.take_along_axis(df.to_numpy(), idx, axis=1)
      #array([[1, 5],
      #       [7, 4],
      #       [3, 0]])
      

      【讨论】:

      • 一旦有了数字idxtake_along_axis 步骤就相当快了。
      • @hpaulj 谢谢!我不确定它是快还是慢,我会记住这一点:)
      • 非常感谢...这种方法与我尝试创建的方法相似。
      猜你喜欢
      • 2017-10-11
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      • 2022-07-19
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 2020-10-02
      相关资源
      最近更新 更多