如何在不影响其他字符的情况下替换pandas数据框列中的特定数字?我有一个很大的csv文件,如下所示:
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
列值
我需要的输出:
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')
,输出如下:
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
它正在用新值替换整个值。有人能帮我解决这个问题吗?谢谢!
发布于 2018-07-12 09:25:45
data['value'].str[3:5].replace('10','00')
返回一个由[3:5]
切分的每个字符串组成的pd.Series
,并在每一行中应用replace
方法。您要查找的是返回整个字符串,并在与您的条件匹配的每一行中应用replace
,这可以像这样实现:
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:')
。
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
根据您的情况,最后一个解决方案不像第一个解决方案那样明确。
发布于 2018-07-12 09:10:44
您可以使用np.where
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
或者受到托马斯的启发
df.value.str.replace(r'\s10\:',' 00:')
发布于 2018-07-12 09:15:43
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,)
https://stackoverflow.com/questions/51295980
复制相似问题