【问题标题】:pandas dataframe check if index exists in a multi index熊猫数据框检查索引是否存在于多索引中
【发布时间】:2018-07-01 02:47:10
【问题描述】:

我有一个 pandas 数据框,它有一个使用列 useriditemid 创建的多索引。 df 是这样的

                  0     1     2
userid  itemid
007     5000      9     4     3
007     4000      6     7     1
009     3000      1     2     3

我想检查数据帧 df 中是否存在索引 [007, 6000]。我怎样才能做到这一点。如果我运行以下代码,则会出现错误TypeError: unhashable type: 'list'

if [007, 6000] in df.index:
    print('it works')

【问题讨论】:

  • pandas 惯用的 in/not in 是 isin。另外,这些是整数还是字符串?

标签: python pandas dataframe multi-index


【解决方案1】:

为此——

df

               0  1  2
userid itemid         
7      5000    9  4  3
       4000    6  7  1
9      3000    1  2  3

df.index.values
array([(7, 5000), (7, 4000), (9, 3000)], dtype=object)

您可以使用df.index.isin

df.index.isin([(7, 5000)])
array([ True, False, False], dtype=bool)

这为您提供了一个与 where 对应的掩码,可以找到该值。如果您只想知道它是否存在,请结合使用np.ndarray.anyisin

df.index.isin([(7, 5000)]).any()
True

df.index.isin([(7, 6000)]).any()
False

【讨论】:

  • 我尝试了这种方法,但收到错误消息TypeError: object of type 'numpy.int64' has no len()
  • @user77005 什么,len 在任何地方都不是我的代码的一部分。你在跑什么?
  • 我的错误。我没有将索引作为元组提供。你的建议有效
  • 有没有办法可以传入字典而不是元组?如果您不必担心索引级别的顺序,那就太好了
【解决方案2】:

使用Index.isin:

df = df.index.isin([('007','5000')])
print (df)
[ True False False]

【讨论】:

    【解决方案3】:

    pd.MultiIndex 转换为list 并检查list 中是否存在

    代码

    import pandas as pd
    
    mi = pd.MultiIndex.from_tuples(
        [(7, 5000), (7, 4000), (8, 3000)], names=['usedId', 'itemId'])
    df = pd.DataFrame([[9, 4, 3], [6, 7, 1], [1, 2, 3]], index=mi)
    
    print('df:', df, sep='\n', end='\n\n')
    print('mi:', mi, sep='\n', end='\n\n')
    
    print('Check for elements in Multi-Index:')
    print('\t(7, 4000) in mi.to_list():', (7, 4000) in mi.to_list())
    print('\t(7, 99) in mi.to_list():', (7, 99) in mi.to_list())
    

    输出

    df:
                   0  1  2
    usedId itemId         
    7      5000    9  4  3
           4000    6  7  1
    8      3000    1  2  3
    
    mi:
    MultiIndex([(7, 5000),
                (7, 4000),
                (8, 3000)],
               names=['usedId', 'itemId'])
    
    Check for elements in Multi-Index:
        (7, 4000) in mi.to_list(): True
        (7, 99) in mi.to_list(): False
    

    【讨论】:

      猜你喜欢
      • 2014-06-26
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 2016-06-13
      • 1970-01-01
      • 1970-01-01
      • 2022-07-10
      • 2015-02-22
      相关资源
      最近更新 更多