首页 > 解决方案 > 基于正则表达式识别列并填充不同默认值的优雅方法

问题描述

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

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')

有没有办法一口气做到这一点?如您所见,我有点重复相同的步骤

标签: pythonregexpython-3.xpandasdataframe

解决方案


对于根据多个条件的多个选择,您可以使用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 

推荐阅读