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

2024-10-01 15:38:16 发布

您现在位置:Python中文网/ 问答频道 /正文

目标是只将某些列(“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中的值。在


Tags: importrighttrue目标dfindexasnp
2条回答

您可以获取列名称,然后仅在子集中应用函数:

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

类似解决方案:

^{pr2}$

{{1}不需要使用{1}注释:

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

选项1
使用^{}^{}
这将在位编辑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
使用^{}^{}
这将生成一个副本并将df单独留在
我使用np.maximum作为变体。我可以用pd.DataFrame.clip
请注意,我使用**np.maximum返回的数据帧解压为字典。它等价于**{c: s for c, s in d.iteritems()},其中dnp.maximum的返回值

^{pr2}$

相关问题 更多 >

    热门问题