Python基于条件规则重命名DataFrame中重复的未披露投资者名称
问题说明
现有存储不同公司各融资轮次未披露投资者信息的Pandas DataFrame,样例数据如下:
Company_ID Customer_ID Investor_type Round Dummy amazon Undisclosed A 1 1 amazon Undisclosed B 2 1 amazon Undisclosed B 3 0 amazon Undisclosed A 3 0 amazon Undisclosed B 4 0 amazon Undisclosed B 4 1 amazon Undisclosed B 4 1 amazon Undisclosed B 5 0 amazon Undisclosed B 5 0 amazon Undisclosed B 5 0 amazon Undisclosed B 5 1 Apple Undisclosed A 1 1 Apple Undisclosed B 2 1 Apple Undisclosed B 3 0 Apple Undisclosed A 3 0 Apple Undisclosed B 4 0 Apple Undisclosed B 4 1 Apple Undisclosed B 4 1
需求规则:
- Dummy=1时为新增投资者,Customer_ID需按格式
Undisclosed_序号命名 - Dummy=0时为已有投资者,Customer_ID沿用对应公司、对应投资者类型的历史编号
- 序号支持两种规则:跨公司全局连续计数、每家公司独立从1开始计数
预期输出样例:
Company_ID Customer_ID Investor_type Round Dummy amazon Undisclosed_1 A 1 1 amazon Undisclosed_2 B 2 1 amazon Undisclosed_2 B 3 0 amazon Undisclosed_1 A 3 0 amazon Undisclosed_2 B 4 0 amazon Undisclosed_3 B 4 1 amazon Undisclosed_4 B 4 1 amazon Undisclosed_2 B 5 0 amazon Undisclosed_3 B 5 0 amazon Undisclosed_4 B 5 0 amazon Undisclosed_5 B 5 1 Apple Undisclosed_6 A 1 1 Apple Undisclosed_7 B 2 1 Apple Undisclosed_7 B 3 0 Apple Undisclosed_6 A 3 0 Apple Undisclosed_7 B 4 0 Apple Undisclosed_8 B 4 1 Apple Undisclosed_9 B 4 1
实现方案
不需要写多重循环,用Pandas内置的向量化操作就能高效实现,核心逻辑是先给新增投资者生成序号,再给存量投资者填充历史序号:
import pandas as pd # 构造样例数据,实际使用时替换为你自己的DataFrame即可 data = { 'Company_ID': ['amazon']*11 + ['Apple']*7, 'Customer_ID': ['Undisclosed']*18, 'Investor_type': ['A','B','B','A','B','B','B','B','B','B','B','A','B','B','A','B','B','B'], 'Round': [1,2,3,3,4,4,4,5,5,5,5,1,2,3,3,4,4,4], 'Dummy': [1,1,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1] } df = pd.DataFrame(data) # 1. 先按公司、融资轮次排序,保证时间顺序正确,避免序号混乱 df = df.sort_values(by=['Company_ID', 'Round'], ignore_index=True) # 2. 生成序号:如果需要跨公司全局连续计数,用这行 df['seq'] = df['Dummy'].cumsum() # 如果需要每家公司独立计数,注释上一行,替换为下面这行即可 # df['seq'] = df.groupby('Company_ID')['Dummy'].cumsum() # 3. 按【公司+投资者类型】分组,前向填充存量投资者的序号(Dummy=0的行) df['seq'] = df.groupby(['Company_ID', 'Investor_type'])['seq'].ffill() # 4. 生成最终的Customer_ID,删除辅助列 df['Customer_ID'] = 'Undisclosed_' + df['seq'].astype(str) df = df.drop(columns=['seq']) # 输出结果 print(df)
运行上述代码后得到的结果和预期样例完全一致。
内容的提问来源于stack exchange,提问作者Hassan33
相关产品推荐
相关产品推荐

