Pandas multiindex:如果在第二个索引中,则打印第一个索引的所有内容

2024-06-16 12:27:45 发布

您现在位置:Python中文网/ 问答频道 /正文

如果第一个索引包含在第二个索引中,我希望查询和dataframe并输出所有项。 用一个简化的版本来描述我要实现的目标是:

data = {'colour': ['red','purple','green','purple','blue','red'], 'item': ['hat','scarf','belt','belt','hat','scarf'], 'material': ['felt','wool','leather','wool','plastic','wool']}
df = pd.DataFrame(data=data)
grpd_df = df.groupby(df['item']).apply(lambda df: df.reset_index(drop=True))
grpd_df

         colour  item material
item

belt   0 green   belt  leather 
       1 purple  belt  wool 

hat    0 red     hat   felt 
       1 blue    hat   plastic 

scarf  0 purple  scarf wool 
       1 red     scarf wool 

我想获取项目中具有红色项目的所有行:

^{pr2}$

Tags: dfdatahatgreenbluereditemmaterial
1条回答
网友
1楼 · 发布于 2024-06-16 12:27:45

通过将列color^{}与{a3}进行比较,将^{}与2系列一起使用,每组至少有一个{}:

df = grpd_df[grpd_df['colour'].eq('red').groupby(level=0).transform('any')]
print (df)
         colour   item material
item                           
hat   0     red    hat     felt
      1    blue    hat  plastic
scarf 0  purple  scarf     wool
      1     red  scarf     wool

细节

^{pr2}$

带有^{}的慢速备选方案:

df = grpd_df.groupby(level=0).filter(lambda x: x['colour'].eq('red').any())

如果要使用原始文件DataFrame

df = df[df['colour'].eq('red').groupby(df['item']).transform('any')]
print (df)
   colour   item material
0     red    hat     felt
1  purple  scarf     wool
4    blue    hat  plastic
5     red  scarf     wool

编辑:

如果要使用MultiIndex

data = {'colour': ['red','purple','green','purple','blue','red'], 'item': ['hat','scarf','belt','belt','hat','scarf'], 'material': ['felt','wool','leather','wool','plastic','wool']}
df = pd.DataFrame(data=data).set_index(['colour','item'])

print (df)    
             material
colour item          
red    hat       felt
purple scarf     wool
green  belt   leather
purple belt      wool
blue   hat    plastic
red    scarf     wool

df = df[pd.Series(df.index.get_level_values('colour') == 'red', index=df.index).groupby(level=1).transform('any')]

第二种解决方案:

df = df.groupby(level=1).filter(lambda x: (x.index.get_level_values('colour') == 'red').any())

print (df)

             material
colour item          
red    hat       felt
purple scarf     wool
blue   hat    plastic
red    scarf     wool

相关问题 更多 >