如何在 Pandas 中根据条件替换列中的值


在 Python 中,我们可以借助 Pandas 的各种内置函数(例如 **loc、where 和 mask、apply 和 lambda** 等)根据条件替换列中的值。Pandas 是一个用于数据操作和处理结构化数据的 Python 库。本文将介绍如何在 Pandas 中根据条件替换列中的值。

方法一:使用 loc

loc 函数用于访问 DataFrame 中的一组行和列。我们可以使用此函数根据某些条件替换列中的值。

语法

df.loc[row_labels, column_labels]

loc 方法用于根据标签从 DataFrame 中选择行和列。这里,**row_labels** 是用于从 DataFrame 中选择行的标签或标签列表,而 **column_labels** 是用于从 DataFrame 中选择列的标签或标签列表。

示例

在下面的示例中,我们将把年龄超过 50 岁的人的性别替换为男性,在我们创建的 DataFrame 中。我们使用 `df.loc[df['age'] >= 50, 'gender']` 来访问所有年龄大于或等于 50 岁的行以及这些行的 'gender' 列。然后,我们将 'gender' 列的值替换为 'M'。

import pandas as pd

data = {
   'name': ['Alice', 'Bob', 'Charlie', 'David', 'Emily'],
   'age': [25, 35, 45, 55, 65],
   'gender': ['F', 'M', 'M', 'F', 'F']
}

df = pd.DataFrame(data)
df.loc[df['age'] >= 50, 'gender'] = 'M'
print(df)

输出

      name  age gender
0    Alice   25      F
1      Bob   35      M
2  Charlie   45      M
3    David   55      M
4    Emily   65      M

方法二:使用 where 和 mask

where 和 mask 函数用于根据条件替换值。where 函数替换条件为 False 的值,而 mask 函数替换条件为 True 的值。

语法

df.where(condition, other=nan, inplace=False, axis=None, level=None, errors='raise')

df.mask(condition, other=nan, inplace=False, axis=None, level=None, errors='raise')

where 和 mask 方法用于根据条件替换 DataFrame 中的值。这里,**condition** 是一个布尔数组或一个可调用函数,用于指定替换条件。**other** 是用于替换现有值的 value。如果 inplace 为 True,则修改原始 DataFrame。**axis** 指定是沿行 (0) 还是列 (1) 替换值。**level** 指定多级索引的级别。errors 指定如何处理错误。

示例

在下面的示例中,我们将把所有性别为男性的人的年龄替换为 0。我们使用 `df['age'].where(df['gender'] != 'M', 0)` 将性别为 'M' 的人的年龄替换为 0。

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Emily'],
    'age': [25, 35, 45, 55, 65],
    'gender': ['F', 'M', 'M', 'F', 'F']
}

df = pd.DataFrame(data)

df['age'] = df['age'].where(df['gender'] != 'M', 0)
print(df)

输出

      name  age gender
0    Alice   25      F
1      Bob    0      M
2  Charlie    0      M
3    David   55      F
4    Emily   65      F

我们也可以使用 mask 方法执行相同的操作。

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Emily'],
    'age': [25, 35, 45, 55, 65],
    'gender': ['F', 'M', 'M', 'F', 'F']
}

df = pd.DataFrame(data)

df['age'] = df['age'].mask(df['gender'] == 'M', 0)
print(df)

输出

      name  age gender
0    Alice   25      F
1      Bob    0      M
2  Charlie    0      M
3    David   55      F
4    Emily   65      F

方法三:使用 Apply 和 Lambda

我们还可以使用 apply 函数和 lambda 函数根据某些条件替换列中的值。

语法

df.apply(func, axis=0, raw=False, result_type=None, args=(), **kwds)

lambda arguments: expression

apply 方法用于将函数应用于 DataFrame。lambda 函数是一种匿名函数,可以与 apply 方法一起使用,将函数应用于 DataFrame 的每一行或每一列。这里,**func** 是要应用于 DataFrame 的函数。**axis** 指定是将函数应用于行 (0) 还是列 (1)。**raw** 如果为 True,则将函数应用于底层的 numpy 数组。**result_types** 指定结果对象的类型。**args** 是要传递给函数的参数元组。**kwargs** 是要传递给函数的其他关键字参数。

示例

在下面的示例中,我们使用 `df.apply(lambda x: 'F' if x['name'].startswith('A') else x['gender'], axis=1)` 将 lambda 函数应用于 DataFrame 的每一行。lambda 函数将名称以 'A' 开头的性别替换为 'F'。

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Emily'],
    'age': [25, 35, 45, 55, 65],
    'gender': ['F', 'M', 'M', 'F', 'F']
}

df = pd.DataFrame(data)

df['gender'] = df.apply(lambda x: 'F' if x['name'].startswith('A') else x['gender'], axis=1)
print(df)

输出

      name  age gender
0    Alice   25      F
1      Bob   35      M
2  Charlie   45      M
3    David   55      F
4    Emily   65      F

方法四:使用 map 方法

map 方法用于根据字典替换 DataFrame 列中的值。

语法

df['column'] = df['column'].map(dict)

这里,**column** 是要替换值的列,**dict** 是将旧值映射到新值的字典。

示例

如果我们想将所有年龄小于或等于 30 岁的人的性别替换为 'F'。我们可以这样使用 map 方法:

import pandas as pd

data = {
   'name': ['Alice', 'Bob', 'Charlie', 'David', 'Emily'],
   'age': [25, 35, 45, 55, 65],
   'gender': ['F', 'M', 'M', 'F', 'F']
}

df = pd.DataFrame(data)

df['age'] = df['age'].mask(df['gender'] == 'M', 0)
print(df)

输出

      name  age gender
0    Alice   25      F
1      Bob    0      M
2  Charlie    0      M
3    David   55      F
4    Emily   65      F

方法五:使用 numpy.where() 方法

numpy.where() 方法用于根据条件替换 DataFrame 列中的值。

语法

df['column'] = np.where(condition, x, y)

这里,**condition** 是一个布尔数组,用于指定替换条件。

**X** 是在条件为 True 时用于替换现有值的 value。**y** 是在条件为 False 时保留的值。

示例

如果我们想将所有性别为 'M' 的人的年龄替换为 0。我们可以这样使用 numpy.where() 方法:

import pandas as pd
import numpy as np
data = {
   'name': ['Alice', 'Bob', 'Charlie', 'David', 'Emily'],
   'age': [25, 35, 45, 55, 65],
   'gender': ['F', 'M', 'M', 'F', 'F']
}

df = pd.DataFrame(data)



df['age'] = np.where(df['gender'] == 'M', 0, df['age'])


print(df)

输出

      name  age gender
0    Alice   25      F
1      Bob    0      M
2  Charlie    0      M
3    David   55      F
4    Emily   65      F

结论

在下面的示例中,我们讨论了如何使用 Python 内置方法(例如 loc、where 和 mask、apply 和 lambda、map() 和 numpy.where() 方法)根据条件在 pandas 中替换列中的值。我们可以根据条件在 pandas 中替换列中的值。根据场景和数据类型,一种方法可能比其他方法更合适。始终选择高效且易于理解的方法是一个好习惯。

更新于:2023年7月10日

8K+ 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.