首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用python pandas替换列中的特定数字。

如何使用python pandas替换列中的特定数字。
EN

Stack Overflow用户
提问于 2018-07-12 08:59:16
回答 4查看 1.5K关注 0票数 4

如何在不影响其他字符的情况下替换pandas数据框列中的特定数字?我有一个很大的csv文件,如下所示:

代码语言:javascript
复制
data = pd.read_csv("meter.csv")
data.head()
Out[10]:
     value  temp1  temp2
0   34 02:0   16.0     17 
1   36 06:0    8.0     27
2   28 10:0   18.0     21
3   34 02:0   16.0     17 
4   36 06:0    8.0     27
5   28 10:0   18.0     21
6   34 02:0   16.0     17 
7   36 06:0    8.0     27
8   28 10:0   18.0     21

如果将value.str[3:5] == 10替换为00,我想替换value列值

我需要的输出:

代码语言:javascript
复制
     value  temp1  temp2
0   34 02:0   16.0     17 
1   36 06:0    8.0     27
2   28 00:0   18.0     21
3   34 02:0   16.0     17 
4   36 06:0    8.0     27
5   28 00:0   18.0     21
6   34 02:0   16.0     17 
7   36 06:0    8.0     27
8   28 00:0   18.0     21

我尝试使用pd.str.replace参考:pandas.Series.str.replace。但却无法实现。

我的代码:data['value'] = data['value'].str[3:5].replace('10','00'),输出如下:

代码语言:javascript
复制
   value  temp1  temp2
0   02   16.0     17 
1   06    8.0     27
2   00   18.0     21
3   02   16.0     17 
4   06    8.0     27
5   00   18.0     21

它正在用新值替换整个值。有人能帮我解决这个问题吗?谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-07-12 09:25:45

data['value'].str[3:5].replace('10','00')返回一个由[3:5]切分的每个字符串组成的pd.Series,并在每一行中应用replace方法。您要查找的是返回整个字符串,并在与您的条件匹配的每一行中应用replace,这可以像这样实现:

代码语言:javascript
复制
import pandas as pd

data = pd.DataFrame({ # small part of your DF
    'value': ['34 02:0', '36 06:0', '28 10:0'], # Third row should be changed
    'temp1': [16.0, 8.0, 18.0],
    'temp2': [17, 27, 21] 
})

mask = data['value'].str[3:5] == '10'
data.loc[mask, 'value'] = data.loc[mask, 'value'].str.replace('10', '00')

>>> print(data)
     value  temp1  temp2
0  34 02:0   16.0     17
1  36 06:0    8.0     27
2  28 00:0   18.0     21 # Third row changes, yay!

如果存在多次匹配'10‘的值,例如10 10:0,则此代码可能会引入错误。您可以通过调用.replace('10:', '00:')来解决此问题。

您也可以只使用正则表达式来匹配r'\s10\:'并调用.replace(re.compile(r'\s10\:'), ' 00:')

代码语言:javascript
复制
import re

r = re.compile(r'\s10\:')
data['value'] = data['value'].str.replace(r, ' 00:', regex=True) # no need to define a condition at all

>>> print(data)
     value  temp1  temp2
0  34 02:0   16.0     17
1  36 06:0    8.0     27
2  28 00:0   18.0     21

根据您的情况,最后一个解决方案不像第一个解决方案那样明确。

票数 2
EN

Stack Overflow用户

发布于 2018-07-12 09:10:44

您可以使用np.where

代码语言:javascript
复制
df.value=np.where(df.value.str[3:5]=='10',df.value.str[:3]+'10'+df.value.str[5:],df.value)
df
Out[21]: 
     value  temp1  temp2
0  34 02:0   16.0     17
1  36 06:0    8.0     27
2  28 10:0   18.0     21
3  34 02:0   16.0     17
4  36 06:0    8.0     27
5  28 10:0   18.0     21
6  34 02:0   16.0     17
7  36 06:0    8.0     27
8  28 10:0   18.0      2

或者受到托马斯的启发

代码语言:javascript
复制
df.value.str.replace(r'\s10\:',' 00:')
票数 2
EN

Stack Overflow用户

发布于 2018-07-12 09:15:43

使用str.slice

代码语言:javascript
复制
mask=df.value.str.slice(3,5) =='10'

df.loc[mask, 'value'] = df.loc[mask].value.str.slice(0,3) + '00' +  df.loc[mask].value.str.slice(5,) 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51295980

复制
相关文章

相似问题

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