熊猫数据框检查索引是不是存在于多索引中
Posted
技术标签:
【中文标题】熊猫数据框检查索引是不是存在于多索引中【英文标题】:pandas dataframe check if index exists in a multi index熊猫数据框检查索引是否存在于多索引中 【发布时间】:2018-07-01 02:47:10 【问题描述】:我有一个 pandas 数据框,它有一个使用列 userid
和 itemid
创建的多索引。 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
。另外,这些是整数还是字符串?
【参考方案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.any
和isin
。
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
【讨论】:
以上是关于熊猫数据框检查索引是不是存在于多索引中的主要内容,如果未能解决你的问题,请参考以下文章