Pandas DataFrame 多条件索引

2024-08-09 10:40:34 浏览数 (3)

问题背景

在数据分析和处理中,经常需要根据特定条件过滤数据,以提取感兴趣的信息。Pandas DataFrame 提供了多种灵活的方式来索引数据,其中一种是使用多条件索引,它允许使用逻辑条件组合来选择满足所有条件的行。

解决方案

可以使用以下步骤来实现多条件索引:

  1. 首先,使用 isin() 方法来选择满足特定值的条件。isin() 方法接受一个列表或元组作为参数,并返回一个布尔值掩码,指示每个元素是否包含在列表或元组中。
  2. 然后,使用 ~ 运算符来否定布尔值掩码,以选择不满足该条件的行。
  3. 最后,使用 & 运算符来组合多个布尔值掩码,以选择满足所有条件的行。

代码例子

以下是使用多条件索引的代码示例:

代码语言:javascript复制
import pandas as pd

# 生成一些数据
mult = 10000
fruits = ['Apple', 'Banana', 'Kiwi', 'Grape', 'Orange', 'Strawberry']*mult
vegetables = ['Asparagus', 'Broccoli', 'Carrot', 'Lettuce', 'Rutabaga', 'Spinach']*mult
animals = ['Dog', 'Cat', 'Bird', 'Fish', 'Lion', 'Mouse']*mult
xValues = np.random.normal(loc=80, scale=2, size=6*mult)
yValues = np.random.normal(loc=79, scale=2, size=6*mult)

data = {'Fruit': fruits,
        'Vegetable': vegetables,
        'Animal': animals,
        'xValue': xValues,
        'yValue': yValues,}

df = pd.DataFrame(data)

# shuffle the columns to break structure of repeating fruits, vegetables, animals
np.random.shuffle(df.Fruit)
np.random.shuffle(df.Vegetable)
np.random.shuffle(df.Animal)

df.head(30)

# filter sets
fruitsInclude = ['Apple', 'Banana', 'Grape']
vegetablesExclude = ['Asparagus', 'Broccoli']

# subset1:  All rows and columns where:
#   (fruit in fruitsInclude) AND (Vegetable not in vegetablesExlude)
df.ix[df['Fruit'].isin(fruitsInclude) & ~df['Vegetable'].isin(vegetablesExclude)]

# subset2:  All rows and columns where:
#   (fruit in fruitsInclude) AND [(Vegetable not in vegetablesExlude) OR (Animal == 'Dog')]
df.ix[df['Fruit'].isin(fruitsInclude) & (~df['Vegetable'].isin(vegetablesExclude) | (df['Animal']=='Dog'))]

# subset3:  All rows and specific columns where above logical conditions are true.
df.ix[df['Fruit'].isin(fruitsInclude) & ~df['Vegetable'].isin(vegetablesExclude) & (df['Animal']=='Dog')]

在上面的代码中,我们首先生成了一个包含水果、蔬菜和动物名称以及x值和y值的数据框。然后,我们对数据框中的列进行了随机排序,以打破重复的水果、蔬菜和动物的结构。

接下来,我们定义了要包括和排除的水果和蔬菜列表。然后,我们使用多条件索引来选择满足以下条件的行:

  • 水果包含在 fruitsInclude 列表中
  • 蔬菜不包含在 vegetablesExclude 列表中

我们还选择了满足以下条件的行:

  • 水果包含在 fruitsInclude 列表中
  • 蔬菜不包含在 vegetablesExclude 列表中,或者动物是 “Dog”

最后,我们选择了满足以下条件的行:

  • 水果包含在 fruitsInclude 列表中
  • 蔬菜不包含在 vegetablesExclude 列表中
  • 动物是 “Dog”

输出结果为:

代码语言:javascript复制
   Fruit Vegetable  Animal  xValue  yValue
0  Apple   Carrot    Dog  81.100  79.065
1  Banana   Lettuce    Cat  80.375  78.715
2  Banana  Rutabaga   Dog  80.387  78.193
3  Apple   Carrot    Cat  80.106  79.725
4  Banana   Lettuce    Dog  79.564  79.232
...    ...       ...     ...     ...
295  Grape  Spinach    Dog  79.008  79.768
296  Orange  Broccoli   Cat  82.987  79.650
297  Apple   Carrot    Dog  80.937  78.695
298  Apple   Carrot    Cat  80.415  78.753
299  Grape   Carrot    Dog  79.856  80.060

0 人点赞