【问题标题】:Mapping rows of a Pandas dataframe to numpy array将 Pandas 数据帧的行映射到 numpy 数组
【发布时间】:2018-07-22 19:27:05
【问题描述】:

抱歉,我知道有很多与索引相关的问题,而且可能让我很头疼,但我在这方面遇到了一些麻烦。我对.loc、.iloc 和.index 方法和切片很熟悉。方法 .reset_index 可能没有(也可能无法)在我们的数据帧上调用,因此索引标签可能不按顺序排列。数据帧和 numpy 数组实际上是数据帧的不同长度子集,但在本示例中,我将保持它们相同的大小(一旦我有示例,我就可以处理偏移)。

这是一张显示我正在寻找的图片:

我可以根据一些搜索条件从数据框中提取行列。

idxlbls = df.index[df['timestamp'] == dt]
stuff = df.loc[idxlbls, 'col3':'col5']

但是如何将其映射到行号(数组索引,而不是标签索引)以用作 numpy 中的数组索引(假设行长度相同)?

stuffprime = array[?, ?]

我需要它的原因是因为数据框更大更完整并且包含列搜索条件,但是 numpy 数组是在管道中预先提取和修改的子集(并且没有相同的搜索条件在他们中)。我需要搜索数据框并从 numpy 数组中提取等效数据。基本上我需要将数据帧中的特定行与 numpy 数组的相应行关联起来。

【问题讨论】:

    标签: python arrays pandas numpy


    【解决方案1】:

    我会将 pandas 索引映射到 numpy 索引:

    keys_dict = dict(zip(idxlbls, range(len(idxlbls))))
    

    然后您可以使用字典 keys_dict 通过 pandas 索引来寻址数组元素:array[keys_dict[some_df_index], :]

    【讨论】:

      【解决方案2】:

      我认为需要get_indexer 用于过滤列名称的位置,因为索引可以使用相同的方式或numpy.where 用于布尔掩码的位置:

      df = pd.DataFrame({'timestamp':list('abadef'),
                         'B':[4,5,4,5,5,4],
                         'C':[7,8,9,4,2,3],
                         'D':[1,3,5,7,1,0],
                         'E':[5,3,6,9,2,4]}, index=list('ABCDEF'))
      
      print (df)
        timestamp  B  C  D  E
      A         a  4  7  1  5
      B         b  5  8  3  3
      C         a  4  9  5  6
      D         d  5  4  7  9
      E         e  5  2  1  2
      F         f  4  3  0  4
      
      idxlbls = df.index[df['timestamp'] == 'a']
      stuff = df.loc[idxlbls, 'C':'E']
      print (stuff)
         C  D  E
      A  7  1  5
      C  9  5  6
      
      a = df.index.get_indexer(stuff.index)
      

      或者通过布尔掩码获取位置:

      a = np.where(df['timestamp'] == 'a')[0]
      
      print (a)
      [0 2]
      

      b = df.columns.get_indexer(stuff.columns)
      print (b)
      [2 3 4]
      

      【讨论】:

      • stuff.rows 而不是 stuff.columns ?
      • @delrocco - 不,在 pandas 中是 stuff.index,stuff.rows 在新版本的 pandas 中未实现(可能在一些较旧的版本中,不确定)
      • 非常抱歉,仍然很困惑...我只需要来自 stuffprime 的第 2 行和第 4 行(numpy 数组,而不是数据框)
      • @delrocco - 我认为需要np.where(df['timestamp'] == dt)[0]
      • 非常感谢!我可以用它来获得我现在真正需要的东西,哈哈!
      猜你喜欢
      • 2021-11-14
      • 2017-04-06
      • 2019-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 2018-08-31
      • 1970-01-01
      相关资源
      最近更新 更多