【问题标题】:Access values in a dataframe based on index and values in another根据索引和另一个数据框中的值访问数据框中的值
【发布时间】:2018-02-12 06:38:15
【问题描述】:

如何根据索引和标题列表从数据帧中获取值?

这些是我拥有的数据框:

a = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]], columns=['a','b','c'])
referencingDf = pd.DataFrame(['c','c','b'])

基于相同的索引,我正在尝试获取以下数据帧输出:

outputDf = pd.DataFrame([3,6,8])

目前,我尝试了这个,但需要采用对角线值。我很确定有更好的方法:

a.loc[referencingDf.index.values, referencingDf[:][0].values]

【问题讨论】:

  • 等一下,你是想得到a[referencingDf[0]]吗?
  • 是的,没错!
  • 那么,你还有什么问题?
  • 我如何引用 a 以基于引用 DF 获得以下 outputDf。本质上是 a[0]['c'], a[1]['c'], a[2]['b']。

标签: python pandas dataframe indexing


【解决方案1】:

你需要lookup:

b = a.lookup(a.index, referencingDf[0])
print (b)
[3 6 8]

df1 = pd.DataFrame({'vals':b}, index=a.index)
print (df1)
   vals
0     3
1     6
2     8

【讨论】:

    【解决方案2】:

    IIUC,您可以在列表理解中使用df.get_value

    vals = [a.get_value(*x) for x in referencingDf.reset_index().values]
    # a simplification would be [ ... for x in enumerate(referencingDf[0])] - DYZ
    print(vals) 
    [3, 6, 8]
    

    然后,构造一个数据框。

    df = pd.DataFrame(vals)
    print(df)
    
       0
    0  3
    1  6
    2  8
    

    【讨论】:

    • ... for x in enumerate(referencingDf[0]) ?
    • @DYZ 绝对是另一种选择,假设referencingDf 具有列的 rangeIndex(可能并不总是如此)。
    【解决方案3】:

    使用列表推导的另一种方式:

    vals = [a.loc[i,j] for i,j in enumerate(referencingDf[0])]
    # [3, 6, 8]
    

    【讨论】:

      【解决方案4】:

      这是一种使用column_indexNumPy's advanced-indexing 的矢量化方法,用于从数据帧的每一行中索引和提取这些值 -

      In [177]: col_idx = column_index(a, referencingDf.values.ravel())
      
      In [178]: a.values[np.arange(len(col_idx)), col_idx]
      Out[178]: array([3, 6, 8])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-07
        • 1970-01-01
        • 2017-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-23
        • 2021-10-14
        相关资源
        最近更新 更多