基于其他行/列内容创建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
关键逻辑说明
- 连续centre分组:通过
cumsum给连续的centre条目分配同一个组ID,确保同组条目共享同一分类结果,完美解决你要求的"后续centre条目分类与前一个保持一致"的需求。 - 最近参考行匹配:每个centre组只匹配它之前最近的符合条件的参考行,保证分类的准确性。
- 高扩展性:如果你的6种分类需要新增更多列,只需要扩展
ref_mapping字典即可,比如添加'cnn': 'refer_cnn'这类映射。
内容的提问来源于stack exchange,提问作者metassi
相关产品推荐
相关产品推荐

