在匹配正则表达式的列中,Pandas将负值替换为零

Rut*_*ste 3 python regex pandas

目标是仅用零替换某些列中的所有负值("capped1"和"capped2"但不是"signed").需要通过正则表达式选择列.(实际df有> 1000列,名称更复杂)

我提出了:

import pandas as pd
import re
import numpy as np
index = [1,2,3,4]
d = {'capped1': [1,0,-1,np.nan], 'capped2': [2,0,np.nan,-9999],'signed':[2,0,-3,np.nan]}
df = pd.DataFrame(data=d, index=index)
df_right = df.filter(regex=("capped.*")).clip(lower=0)
df_left = df.drop(list(df_right.columns), 1)
df_out = df_left.merge(df_right,left_index=True,right_index=True,how="outer")
df_out
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点?我的猜测是,这可以替换为一行而不是3,直接替换df中的值.

piR*_*red 5

选项1
使用pd.DataFrame.update与 此编辑到位 pd.DataFrame.clip
df

df.update(df.filter(regex="^capped.*$").clip(lower=0))
df

   capped1  capped2  signed
1      1.0      2.0     2.0
2      0.0      0.0     0.0
3      0.0      NaN    -3.0
4      NaN      0.0     NaN
Run Code Online (Sandbox Code Playgroud)

选项2
使用pd.DataFrame.assign和 这产生一个副本,单独留下 我用作多样性.我可以使用 通知我用来解压缩作为字典返回的数据帧.它相当于地方是从返回值np.maximum
df
np.maximumpd.DataFrame.clip
**np.maximum**{c: s for c, s in d.iteritems()}dnp.maximum

df.assign(**np.maximum(df.filter(regex='^capped.*'), 0))

   capped1  capped2  signed
1      1.0      2.0     2.0
2      0.0      0.0     0.0
3      0.0      NaN    -3.0
4      NaN      0.0     NaN
Run Code Online (Sandbox Code Playgroud)