【问题标题】:MultiIndex for pandas dataframe熊猫数据框的多索引
【发布时间】:2015-11-11 16:35:42
【问题描述】:

我有这个代码:

 new_dict = {'x':[1,2,3,4,5], 'y':[11,22,33,44,55], 'val':[100, 200, 300, 400, 500]}
df = pd.DataFrame.from_dict(new_dict)   
    val  x   y
0  100  1  11
1  200  2  22
2  300  3  33
3  400  4  44
4  500  5  55

我希望能够结合使用xy 的值作为val 的索引, 例如

df[3][33]
300

实现这一目标的最佳方法是什么?我知道这一定与多索引有关,但我不确定具体如何。

【问题讨论】:

  • 对不起,你要df.loc[(df['x']==3) & (df['y']==33), 'val']
  • 这确实会给出正确的结果,但我想知道是否有更优雅、语法更简洁的方法。
  • 好吧,你这里没有多索引,除了你要找的是行值匹配,你在这里没有使用任何索引
  • 谢谢。但是构造一个多索引,然后使用它更实用吗?
  • 视情况而定,但如果您确实设置了索引,那么您可以使用df.set_index(['x','y']).loc[3,33],这在语法上可能对您来说更容易

标签: python pandas dataframe multi-index


【解决方案1】:

您可以将 2 个布尔条件定义为掩码并与 .loc 一起使用:

df.loc[(df['x']==3) & (df['y']==33), 'val']

否则只需设置索引,然后您可以使用这些值来索引 df:

In [233]:
df = df.set_index(['x','y'])
df.loc[3,33]

Out[233]:
val    300
Name: (3, 33), dtype: int64

你可以很容易地将第一个版本包装成一个函数

【讨论】:

    【解决方案2】:

    你可以定义一个函数:

    new_dict = {'x':[1,2,3,4,5], 'y':[11,22,33,44,55], 'val':[100, 200, 300, 400,   500]}
    
    df = pd.DataFrame.from_dict(new_dict) 
    
    def multindex(x,y):
        return df.set_index(['x','y']).loc[x,y]
    
    multindex(1,11) #will return '100'
    

    【讨论】:

    • 为了返回单个元素而构造具有多索引的df似乎很浪费
    猜你喜欢
    • 1970-01-01
    • 2016-06-13
    • 2017-02-22
    • 2019-05-21
    • 2019-03-18
    • 2018-01-08
    • 2017-12-14
    • 2022-07-10
    • 2018-08-01
    相关资源
    最近更新 更多