首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据条件替换列范围内的所有值

根据条件替换列范围内的所有值
EN

Stack Overflow用户
提问于 2020-04-19 11:59:21
回答 1查看 304关注 0票数 1

如何根据条件替换多列中的值?

假设我有一个如下所示的df:

代码语言:javascript
运行
复制
df = pd.DataFrame({'A': [1,2,3,4], 'C': [1,2,3,4], 'B': [3,4,6,6]})

使用numpy,我可以根据如下条件更改列的值:

代码语言:javascript
运行
复制
df['A'] = np.where((df['B'] < 5), '-', df['A'])

但是,如何根据条件更改许多列的值呢?我想我可以做下面这样的事,但这不管用。

代码语言:javascript
运行
复制
df[['A','C']] = np.where((df['B'] < 5), '-', df[['A', 'C']])

我可以做一个循环,但感觉不是很重。

代码语言:javascript
运行
复制
cols = ['A', 'C']

for col in cols:
    df[col] = np.where((df['B'] < 5), '-', df[col])
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-19 12:01:33

一种方法是使用DataFrame.mask

代码语言:javascript
运行
复制
df[['A','C']] = df[['A', 'C']].mask(df['B'] < 5, '-')
print (df)
   A  C  B
0  -  -  3
1  -  -  4
2  3  3  6
3  4  4  6

DataFrame.loc替代解决方案

代码语言:javascript
运行
复制
df.loc[df['B'] < 5, ['A','C']] =  '-'
print (df)
   A  C  B
0  -  -  3
1  -  -  4
2  3  3  6
3  4  4  6

使用numpy.where和广播掩码的解决方案:

代码语言:javascript
运行
复制
df[['A','C']] = np.where((df['B'] < 5)[:, None], '-', df[['A', 'C']])

性能(如果混合值-带有字符串-的数值)

代码语言:javascript
运行
复制
df = pd.DataFrame({'A': [1,2,3,4], 'C': [1,2,3,4], 'B': [3,4,6,6]})
#400k rows
df = pd.concat([df] * 100000, ignore_index=True)

In [217]: %timeit df[['A','C']] = df[['A', 'C']].mask(df['B'] < 5, '-')
171 ms ± 13.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [219]: %timeit df[['A','C']] = np.where((df['B'] < 5)[:, None], '-', df[['A', 'C']])
72.5 ms ± 11.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [221]: %timeit df.loc[df['B'] < 5, ['A','C']] =  '-'
27.8 ms ± 533 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

如果用数字替换Performace

代码语言:javascript
运行
复制
df = pd.DataFrame({'A': [1,2,3,4], 'C': [1,2,3,4], 'B': [3,4,6,6]})
df = pd.concat([df] * 100000, ignore_index=True)

In [229]: %timeit df[['A','C']] = df[['A', 'C']].mask(df['B'] < 5, 0)
187 ms ± 4.24 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [231]: %timeit df[['A','C']] = np.where((df['B'] < 5)[:, None], 0, df[['A', 'C']])
20.8 ms ± 455 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [233]: %timeit df.loc[df['B'] < 5, ['A','C']] =  0
61.3 ms ± 1.06 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61303962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档