在大尺寸数据框上填充多列默认值的有效方法
Efficient way to fill default values for multiple columns on Big size dataframe
我有一个包含 150 万条记录的数据框 obs
。我想用默认值填写 NA,如下所示。
obs = pd.DataFrame({'person_id' :[1,2,3],'obs_date':['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]})
逻辑是根据列名填3个默认值
1) 以 id
结尾的列 - 填充 0
2) 以 value
结尾的列 - 以 ' ' (blank/empty)
填充
3) cols 包含 date
- fillna with 12/31/2000
虽然我下面的代码工作正常(基于 SO 的建议),但有没有办法固定它?
%%timeit
c = obs.columns.str
c1 = c.endswith('id')
c2 = c.endswith('value')
c3 = c.contains('date')
obs_final = np.select([c1,c2,c3], [obs.fillna(0), obs.fillna(''),
obs.fillna("12/31/2000")])
obs_final = pd.DataFrame(obs_final, columns=obs.columns)
需要 19.5 s ± 303 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
- 这正常吗?
有什么可以改进的吗?
我不确定这是否会使速度更快,但您可以尝试一下
obs[obs.columns[c1]] = obs[obs.columns[c1]].fillna(0)
obs[obs.columns[c2]] = obs[obs.columns[c2]].fillna('')
obs[obs.columns[c3]] = obs[obs.columns[c3]].fillna("12/31/2000")
Select 列 DataFrame.loc
并使用 fillna
:
obs.loc[:, c1] = obs.loc[:, c1].fillna(0)
obs.loc[:, c2] = obs.loc[:, c2].fillna('')
obs.loc[:, c3] = obs.loc[:, c3].fillna("12/31/2000")
我有一个包含 150 万条记录的数据框 obs
。我想用默认值填写 NA,如下所示。
obs = pd.DataFrame({'person_id' :[1,2,3],'obs_date':['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]})
逻辑是根据列名填3个默认值
1) 以 id
结尾的列 - 填充 0
2) 以 value
结尾的列 - 以 ' ' (blank/empty)
3) cols 包含 date
- fillna with 12/31/2000
虽然我下面的代码工作正常(基于 SO 的建议),但有没有办法固定它?
%%timeit
c = obs.columns.str
c1 = c.endswith('id')
c2 = c.endswith('value')
c3 = c.contains('date')
obs_final = np.select([c1,c2,c3], [obs.fillna(0), obs.fillna(''),
obs.fillna("12/31/2000")])
obs_final = pd.DataFrame(obs_final, columns=obs.columns)
需要 19.5 s ± 303 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
- 这正常吗?
有什么可以改进的吗?
我不确定这是否会使速度更快,但您可以尝试一下
obs[obs.columns[c1]] = obs[obs.columns[c1]].fillna(0)
obs[obs.columns[c2]] = obs[obs.columns[c2]].fillna('')
obs[obs.columns[c3]] = obs[obs.columns[c3]].fillna("12/31/2000")
Select 列 DataFrame.loc
并使用 fillna
:
obs.loc[:, c1] = obs.loc[:, c1].fillna(0)
obs.loc[:, c2] = obs.loc[:, c2].fillna('')
obs.loc[:, c3] = obs.loc[:, c3].fillna("12/31/2000")