簡體   English   中英

在匹配正則表達式的列中,Pandas將負值替換為零

[英]Pandas replace negative value with zero, in columns that match a regular expression

目標是僅用零替換某些列中的所有負值(“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

有沒有更好的方法來做到這一點? 我的猜測是,這可以替換為一行而不是3,直接替換df中的值。

選項1
pd.DataFrame.updatepd.DataFrame.clip pd.DataFrame.update使用
這編輯了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

選項2
使用pd.DataFrame.assignnp.maximum
這會生成一個副本並單獨留下df
我使用np.maximum作為變種。 我可以使用pd.DataFrame.clip
請注意,我使用**來解壓縮np.maximum返回的數據幀作為字典。 它相當於**{c: s for c, s in d.iteritems()} ,其中d是來自np.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

您可以獲取列名稱,然后僅在子集中應用函數:

cols = df.columns[df.columns.str.contains('^capped.*')]
print (cols)
Index(['capped1', 'capped2'], dtype='object')

df[cols] = df[cols].clip(lower=0)
print (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

類似方案:

m = df.columns.str.contains('^capped.*')
print (m)
[ True  True False]

df.loc[:, m] = df.loc[:, m].clip(lower=0)
print (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

Jon Clements評論的好主意 - 使用regex是沒有必要的,這里可以使用startswith

 cols = df.columns[df.columns.str.startswith('capped')]
 m = df.columns.str.startswith('capped')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM