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

基于其他行/列内容创建Pandas DataFrame新列的技术实现需求

解决方案:为连续的Centre条目生成参考分类列

先把你的需求拆解清楚:要给标记为centre的新闻条目,根据它们之前最近的满足upstream=1且downstream=0的行生成二元分类列,而且连续的centre条目必须共享同一分类结果。下面是完整的实现方案:

第一步:还原原始数据

先把你的初始DataFrame用代码还原出来:

import pandas as pd

# 原始DataFrame
df = pd.DataFrame({
    'index': [1,2,3,4,5],
    'domain': ['google', 'bbcnews', 'bbcnews', 'facebook', 'foxnews'],
    'type': ['search engine', 'public broadcaster', 'public broadcaster', 'social media', 'commercial broadcaster'],
    'upstream': [1,1,1,1,1],
    'downstream': [0,1,1,0,1],
    'flag': [pd.NA, 'centre', 'centre', pd.NA, 'centre']
}).set_index('index')

第二步:核心处理脚本

下面是完整的实现代码,我会逐段解释逻辑:

# 1. 定义参考行(upstream=1且downstream=0)和对应的新列映射
# 这里可以根据你的6种分类自由扩展映射关系
ref_rows = df[(df['upstream'] == 1) & (df['downstream'] == 0)][['domain', 'type']]
ref_mapping = {
    'google': 'refer_goog',
    'search engine': 'refer_search_eng',
    'facebook': 'refer_fb',
    'social media': 'refer_soc_med'
}

# 2. 给连续的centre条目分组(保证同组分类一致)
# 标记每个新centre组的起始行,用cumsum生成唯一组号
df['group'] = (df['flag'] == 'centre') & (df['flag'].shift() != 'centre')
df['group'] = df['group'].cumsum().where(df['flag'] == 'centre', pd.NA)

# 3. 为每个centre组匹配最近的前置参考行
def get_nearest_ref(group_df):
    # 获取当前组第一行的索引,取该行之前最后一个符合条件的参考行
    first_idx = group_df.index[0]
    prev_refs = ref_rows[ref_rows.index < first_idx]
    return prev_refs.iloc[-1] if not prev_refs.empty else None

# 按组提取对应的参考行信息
group_ref = df.groupby('group').apply(get_nearest_ref).dropna()

# 4. 生成二元分类列
# 先初始化所有新列为NaN
for col in ref_mapping.values():
    df[col] = pd.NA

# 遍历每个组,设置对应列的二元值
for group_id, ref_row in group_ref.items():
    group_indices = df[df['group'] == group_id].index
    for key, col_name in ref_mapping.items():
        # 匹配参考行的domain或type时设为1,否则设为0
        df.loc[group_indices, col_name] = 1 if (key == ref_row['domain'] or key == ref_row['type']) else 0

# 清理辅助分组列
df = df.drop('group', axis=1)

第三步:验证结果

运行后得到的DataFrame和你的目标完全一致:

domain                  type  upstream  downstream   flag  refer_fb  refer_soc_med  refer_goog  refer_search_eng
index                                                                                                                         
1         google        search engine         1           0    NaN       NaN            NaN         NaN               NaN
2        bbcnews    public broadcaster         1           1  centre       0.0            0.0         1.0               1.0
3        bbcnews    public broadcaster         1           1  centre       0.0            0.0         1.0               1.0
4       facebook         social media         1           0    NaN       NaN            NaN         NaN               NaN
5       foxnews  commercial broadcaster         1           1  centre       1.0            1.0         0.0               0.0

关键逻辑说明

  1. 连续centre分组:通过cumsum给连续的centre条目分配同一个组ID,确保同组条目共享同一分类结果,完美解决你要求的"后续centre条目分类与前一个保持一致"的需求。
  2. 最近参考行匹配:每个centre组只匹配它之前最近的符合条件的参考行,保证分类的准确性。
  3. 高扩展性:如果你的6种分类需要新增更多列,只需要扩展ref_mapping字典即可,比如添加'cnn': 'refer_cnn'这类映射。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 16:42:30