【Pandas】pandas DataFrame mask

Pandas2.2 DataFrame

Indexing, iteration

方法描述
DataFrame.head([n])用于返回 DataFrame 的前几行
DataFrame.at快速访问和修改 DataFrame 中单个值的方法
DataFrame.iat快速访问和修改 DataFrame 中单个值的方法
DataFrame.loc用于基于标签(行标签和列标签)来访问和修改 DataFrame 中的数据
DataFrame.iloc用于基于整数位置(行号和列号)来访问和修改 DataFrame 中的数据
DataFrame.insert(loc, column, value[, …])用于在 DataFrame 的指定位置插入一个新的列
DataFrame.iter()用于迭代 DataFrame 的列名
DataFrame.items()用于迭代 DataFrame 的列名和列数据
DataFrame.keys()返回 DataFrame 的列名
DataFrame.iterrows()用于逐行迭代 DataFrame
DataFrame.itertuples([index, name])用于逐行迭代 DataFrame
DataFrame.pop(item)用于从 DataFrame 中删除指定列
DataFrame.tail([n])用于返回 DataFrame 的最后 n
DataFrame.xs(key[, axis, level, drop_level])用于从 DataFrame 中提取一个横截面(cross-section)
DataFrame.get(key[, default])用于从 DataFrame 中获取指定列的数据
DataFrame.isin(values)用于检查 DataFrame 中的每个元素是否包含在指定的值集合中
DataFrame.where(cond[, other, inplace, …])用于根据条件筛选 DataFrame 中的元素
DataFrame.mask(cond[, other, inplace, axis, …])用于根据条件筛选 DataFrame 中的元素

pandas.DataFrame.mask()

pandas.DataFrame.mask(cond, other=<no_default>, *, inplace=False, axis=None, level=None) 方法用于根据条件筛选 DataFrame 中的元素。如果条件为 True,则用 other 参数指定的值替换该元素;如果条件为 False,则保留原值。

参数
  • cond:布尔条件,可以是布尔值、布尔数组、布尔 DataFrame 或布尔 Series。
  • other:可选参数,当条件为 True 时使用的值。默认为 NaN
  • inplace:布尔值,如果为 True,则直接在原 DataFrame 上进行修改,否则返回一个新的 DataFrame。默认为 False
  • axis:指定轴,0'index' 表示按行,1'columns' 表示按列。默认为 None
  • level:如果索引是多级索引,指定要使用的级别。默认为 None
返回值
  • 如果 inplace=False,返回一个新的 DataFrame。
  • 如果 inplace=True,返回 None
示例

假设我们有一个 DataFrame 如下:

import pandas as pd
import numpy as np

data = {
    'A': [1, 2, 3, 4],
    'B': [5, 6, 7, 8]
}

df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)

输出:

原始 DataFrame:
   A  B
0  1  5
1  2  6
2  3  7
3  4  8
示例 1:使用布尔条件替换值

A 列中大于 2 的值替换为 NaN

result = df.mask(df['A'] > 2)
print("\n将 A 列中大于 2 的值替换为 NaN:")
print(result)

输出:

将 A 列中大于 2 的值替换为 NaN:
     A    B
0  1.0  5.0
1  2.0  6.0
2  NaN  7.0
3  NaN  8.0
示例 2:使用布尔条件和自定义替换值

A 列中大于 2 的值替换为 0

result = df.mask(df['A'] > 2, other=0)
print("\n将 A 列中大于 2 的值替换为 0:")
print(result)

输出:

将 A 列中大于 2 的值替换为 0:
   A  B
0  1  5
1  2  6
2  0  7
3  0  8
示例 3:使用布尔 DataFrame 替换值

A 列中大于 2 的值替换为 NaNB 列中大于 6 的值替换为 NaN

cond = (df['A'] > 2) | (df['B'] > 6)
result = df.mask(cond)
print("\n将 A 列中大于 2 的值和 B 列中大于 6 的值替换为 NaN:")
print(result)

输出:

将 A 列中大于 2 的值和 B 列中大于 6 的值替换为 NaN:
     A    B
0  1.0  5.0
1  2.0  6.0
2  NaN  NaN
3  NaN  NaN
示例 4:使用 inplace=True 直接修改原 DataFrame

A 列中大于 2 的值替换为 0,直接修改原 DataFrame:

df.mask(df['A'] > 2, other=0, inplace=True)
print("\n直接修改原 DataFrame:")
print(df)

输出:

直接修改原 DataFrame:
   A  B
0  1  5
1  2  6
2  0  7
3  0  8
示例 5:使用多级索引

假设我们有一个多级索引的 DataFrame:

index = pd.MultiIndex.from_tuples([('a', 'x'), ('a', 'y'), ('b', 'x'), ('b', 'y')], names=['first', 'second'])
df = pd.DataFrame(data, index=index)
print("原始 DataFrame:")
print(df)

输出:

原始 DataFrame:
              A  B
first second       
a     x       1  5
      y       2  6
b     x       0  0
      y       0  0

使用 mask 方法并指定 level 参数:

result = df.mask(df['A'] > 2, level='first')
print("\n使用 mask 方法并指定 level 参数:")
print(result)

输出:

使用 mask 方法并指定 level 参数:
              A    B
first second       
a     x    1.0  5.0
      y    2.0  6.0
b     x    NaN  NaN
      y    NaN  NaN
总结

pandas.DataFrame.mask 方法提供了一种灵活的方式来根据条件筛选和替换 DataFrame 中的元素。你可以使用布尔条件、布尔数组或布尔 DataFrame 来指定哪些元素需要替换,哪些需要保留。通过 other 参数可以指定替换的值,默认为 NaNinplace 参数允许你选择是否直接修改原 DataFrame。这对于数据清洗和预处理非常有用。

### 如何在 Pandas DataFrame 中根据日期条件筛选数据 为了实现基于日期的过滤操作,可以利用 `pandas` 提供的强大功能来完成这一目标。假设有一个名为 `df` 的 DataFrame 对象,其中包含一列表示时间戳的数据。 对于给定的时间范围内的记录提取,可以通过定义起始时间和结束时间变量并应用布尔索引来达到目的。下面展示了一个具体的实例: ```python import pandas as pd # 假设已经创建好了带有'date'列和其他相关数据的DataFrame对象df start_date = '2022-01-03' end_date = '2022-01-07' mask = (df['date'] >= start_date) & (df['date'] <= end_date) filtered_df = df.loc[mask] print(filtered_df) ``` 这段代码首先设置了想要查询的具体时间段[start_date,end_date],接着构建了一个掩码(即逻辑数组),该掩码用于标记哪些行应该被保留下来;最后通过 `.loc[]` 方法依据此掩码获取符合条件的新子集 DataFrame[^1]。 另外一种常见的情况是从某个具体时刻之后的所有条目中选取数据,这同样简单易行: ```python cutoff_date = '2022-01-05' after_cutoff = df[df['date'] > cutoff_date] print(after_cutoff) ``` 这里只设置了一个截止日期 `cutoff_date` ,并通过简单的比较运算符实现了对指定日期后的所有记录的选择[^5]。 当涉及到更复杂的场景比如寻找连续日期组时,则可能需要用到额外的技术手段如计算相邻两行之间的时间差值等方法[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liuweidong0802

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值