Skip to main content
 首页 » 编程设计

python之基于正则表达式识别列并填充不同默认值的优雅方法

2025年05月04日31youxin

我有一个可以从下面的代码生成的数据框

df = pd.DataFrame({'person_id' :[1,2,3],'date1':['12/31/2007','11/25/2009',np.nan], 
           'hero_id':[2,4,np.nan],'date2':['12/31/2017',np.nan,'10/06/2015'], 
           'heroine_id':[1,np.nan,5],'date3':['12/31/2027','11/25/2029',np.nan], 
           'bud_source_value':[1250000,250000,np.nan], 
           'prod__source_value':[10000,20000,np.nan]}) 

数据框看起来像下面显示的 Nan 的

我想做的是

1) 对于以“id”结尾的列,用 0(零)填充 na 2) 对于以“值”结尾的列,用“未知”填充 na 3) 对于以“日期”开头的列,用“12/31/9999”填充 na

我试过下面的方法,但是很长而且感觉不够优雅

df2 = df.filter(regex='id$') 
df2.fillna(0) 
 
df2 = df.filter(regex='^date') 
df2.fillna('12/31/9999') 
 
df2 = df.filter(regex='value$') 
df2.fillna('unknown') 

有没有办法一次性实现?如您所见,我正在重复相同的步骤

请您参考如下方法:

根据多个条件进行多项选择可以使用np.select :

import numpy as np 
 
# choices 
c = df.columns.str 
c1 = c.endswith('id') 
c2 = c.endswith('value') 
c3 = c.startswith('date') 
 
out = np.select([c1,c2,c3], [df.fillna(0), df.fillna('unknown'), df.fillna("12/31/9999")]) 
pd.DataFrame(out, columns=df.columns) 
 
    person_id   date1     hero_id  date2       heroine_id  date3  \ 
0         1  12/31/2007       2  12/31/2017          1  12/31/2027    
1         2  11/25/2009       4  12/31/9999          0  11/25/2029    
2         3  12/31/9999       0  10/06/2015          5  12/31/9999    
 
      bud_source_value prod__source_value   
0         1.25e+06              10000   
1           250000              20000   
2          unknown            unknown