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

Python:按多条件统计未披露投资方新增唯一值并生成虚拟变量

Pandas 实现方案

整体实现逻辑:先按「公司+融资轮次+投资方类型」统计每轮未披露投资方的数量,和同公司上一轮的对应数量取差值得到新增数,再将新增标记映射回原DataFrame即可,完整实现代码如下:

import pandas as pd
import numpy as np

# ---------------------- 第一步:构造示例测试数据(实际使用时替换为你的数据导入代码即可)
df = pd.DataFrame({
    'Company': ['X', 'X', 'X', 'X', 'X', 'X', 'Y', 'Y'],
    'Investor': ['Undisclosed', 'VC A', 'Undisclosed', 'Undisclosed', 'Undisclosed', 'VC B', 'Undisclosed', 'Undisclosed'],
    'Round': [3, 3, 4, 4, 4, 4, 1, 2],
    'Investor type': ['B', 'A', 'B', 'B', 'B', 'A', 'A', 'A']
})

# ---------------------- 第二步:统计每轮各类型未披露投资方数量
# 筛选未披露投资方,分组计数
undisclosed_counts = df[df['Investor'] == 'Undisclosed'].groupby(
    ['Company', 'Round', 'Investor type'], as_index=False
).agg(count=('Investor', 'count'))

# 宽表转换,把A、B类型转为单独列
counts_pivot = undisclosed_counts.pivot(
    index=['Company', 'Round'], 
    columns='Investor type', 
    values='count'
).fillna(0).rename(columns={'A': 'A_count', 'B': 'B_count'}).reset_index()

# ---------------------- 第三步:计算每轮新增未披露投资方数量
# 按公司分组,轮次升序排序
counts_pivot = counts_pivot.sort_values(['Company', 'Round'])

# 取同公司上一轮的A、B类未披露数量,差值低于0时新增数按0算
counts_pivot['prev_A'] = counts_pivot.groupby('Company')['A_count'].shift(1).fillna(0)
counts_pivot['prev_B'] = counts_pivot.groupby('Company')['B_count'].shift(1).fillna(0)
counts_pivot['new_A'] = (counts_pivot['A_count'] - counts_pivot['prev_A']).clip(lower=0)
counts_pivot['new_B'] = (counts_pivot['B_count'] - counts_pivot['prev_B']).clip(lower=0)

# ---------------------- 第四步:将新增标记映射回原表,生成最终字段
# 合并新增数到原表
df = df.merge(counts_pivot[['Company', 'Round', 'new_A', 'new_B']], on=['Company', 'Round'], how='left').fillna(0)

# 初始化标记列
df['Unique_A'] = 0
df['Unique_B'] = 0

# 标记A类新增未披露投资方:每轮前N个A类未披露标记为1,N为该轮新增数
a_mask = (df['Investor'] == 'Undisclosed') & (df['Investor type'] == 'A')
df.loc[a_mask, 'Unique_A'] = (df[a_mask].groupby(['Company', 'Round']).cumcount() < df[a_mask]['new_A']).astype(int)

# 标记B类新增未披露投资方
b_mask = (df['Investor'] == 'Undisclosed') & (df['Investor type'] == 'B')
df.loc[b_mask, 'Unique_B'] = (df[b_mask].groupby(['Company', 'Round']).cumcount() < df[b_mask]['new_B']).astype(int)

# 清理中间辅助列
df = df.drop(columns=['new_A', 'new_B'])

# 输出结果
print(df)

注意事项

  • 需确保Round字段为可排序的数值类型,如果是字符串格式(如「A轮」「Pre-B轮」)需要先映射为数值顺序再处理
  • 代码默认公司首次融资的所有未披露投资方全部计为新增,如有特殊要求可以修改shift(1).fillna(0)中的默认填充值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:45:05