You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Boolean Indexing为Pandas DataFrame生成对应新列

Pandas实现分组标记填充

首先构造原始DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'col1': ['X1', 'foo', 'foo', 'X2', 'foo', 'foo', 'X3', 'foo', 'foo'],
    'col2': [np.nan, 'bar', 'bar', np.nan, 'bar', 'bar', np.nan, 'bar', 'bar'],
    'col3': [np.nan, 'baz', 'baz', np.nan, 'baz', 'baz', np.nan, 'baz', 'baz']
})

实现方案

我们需要将X1/X2/X3这类分组标记行的col1值,填充到后续数据行的新列new中,同时移除标记行,以下是两种简洁实现方式:

方法1:布尔标记+向前填充

# 提取分组标记行的col1值,其他行设为NaN
df['new'] = df.where(df.notna().sum(axis=1) == 1, np.nan)['col1']

# 向前填充,让后续数据行继承最近的分组标记
df['new'] = df['new'].ffill()

# 过滤掉分组标记行(保留col2非空的数据行)
result = df[df['col2'].notna()].reset_index(drop=True)

执行后得到目标结果:

col1 col2 col3 new
0  foo  bar  baz  X1
1  foo  bar  baz  X1
2  foo  bar  baz  X2
3  foo  bar  baz  X2
4  foo  bar  baz  X3
5  foo  bar  baz  X3

方法2:分组ID映射

如果需要更直观的分组逻辑,可以通过生成分组ID来实现:

# 累计分组标记行的数量,生成唯一分组ID
df['group_id'] = (df.notna().sum(axis=1) == 1).cumsum()

# 提取每个分组对应的标记值
group_labels = df[df.notna().sum(axis=1) == 1].set_index('group_id')['col1']

# 通过分组ID映射标记值到新列
df['new'] = df['group_id'].map(group_labels)

# 过滤数据行并清理临时列
result = df[df['col2'].notna()].drop('group_id', axis=1).reset_index(drop=True)

两种方法都能达成需求,第一种代码更简洁,第二种逻辑更易理解,可根据实际场景选择。

内容的提问来源于stack exchange,提问作者iBeMeltin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:52:34