python - 基于正则表达式识别列并填充不同默认值的优雅方法
问题描述
我有一个可以从下面的代码生成的数据框
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
推荐阅读
- python - 如何从 NYSE 和 NASDAQ 获取代码列表?
- logstash - 如何更改logstash中的日期格式
- azure-data-factory - Azure 数据工厂:使用大量参数调试数据流
- excel - 通过 VBA 加载新数据文件后的动态公式调整
- go - 全局变量地址
- javascript - 检查 webElement 是否不包含文本,在 Cypress 中不区分大小写
- python - Bokeh - 为 Networkx Graph 添加边缘标签/边缘属性
- haskell - 如何使用光泽加速渲染 mandelbrot
- firebase - 如何使用 Firestore 在 Flutter 中搜索文本
- c# - 在我的字符串列表中使用 Contains() 和 Add() 方法,但它没有运行