pandas 检查多索引数据帧中的一个特定索引中是否存在值

问题描述 投票:0回答:4

我有一个名为

MultiIndex
df
数据框,其中包含 3
indexes
(水果、颜色、味道)。我想搜索 1 个特定的
index
,即
index
Color
,看看其中是否存在
value

例如:代码看起来像这样。

Color
是数据框中的
index
,而不仅仅是一列。

if 'purple' in 'Color':
    print('yes')
else:
    print('no')

我只想搜索

Color
而不是任何其他
indexes/columns

                       Quantity     Quality
Fruit   Color   Taste
apple   red     tart     12          good
lemon   yellow  sour     11          average
grapes  purple  sweet     5          bad
lime    green   citrus    3          excellent

非常感谢您抽出时间!

python pandas dataframe indexing
4个回答
6
投票

您可以使用

get_level_values
进行过滤。

if "purple" in df.index.get_level_values('Color'):
    print('yes')
else:
    print('no')

5
投票

如果您想要表格输出,可以使用它:

def check(data:pd.DataFrame,l:list):
    c = data.index.get_level_values("Color").isin(l)
    return np.where(c,'yes','no')

df['Result'] = check(df,['purple'])

print(df)

                       Quantity    Quality Result
Fruit  Color  Type                              
apple  red    tart          12       good     no
lemon  yellow sour          11    average     no
grapes purple sweet          5        bad    yes
lime   green  citrus         3  excellent     no

1
投票

您还可以检查该值是否在

index.unique(level)
中。这样就不需要将整个索引复制到列表中。也可能会让后续的搜索更快。

if "purple" in df.index.unique(level="Color"): 
    print("yes")
else: 
    print("no")

0
投票

我同意其他答案,即 df.index.get_level_values('level_name') 是正确的方法。然而,我认为更标准的 pandas 实现是使用矢量化方法返回布尔系列(当然这并不完全是 OP 所要求的):

is_purple = df.index.get_level_values('color') == 'purple' # <-- result is a boolean series
# Then filter as needed
only_purple = df[is_purple]
# Or use np.where to get yes/no strings if needed
df['Result'] = np.where(is_purple, 'yes', 'no')
© www.soinside.com 2019 - 2024. All rights reserved.