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

4

如何在不影响其他字符的情况下,替换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列的值,如果value.str[3:5] == 10,则用00替换。

我需要的输出:

     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

它是用新值替换整个值。有谁能帮我解决这个问题。 谢谢!

4个回答

2
你可以使用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

或者受到Tomas的启发

df.value.str.replace(r'\s10\:',' 00:')

非常感谢提供的替代方案! - AbJ

2

data['value'].str.replace('10','00').str[3:5] 返回一个由每个字符串经过[3:5]切片并应用replace方法的pd.Series。你要做的是返回在每一行中满足条件的整个字符串应用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

这个最后的解决方案没有第一个方案那么明确,涉及到你的条件。

太棒了,解释得非常清晰!非常感谢! - AbJ
太棒了,解释得非常清晰!非常感谢! - AbJ

1

使用 str.slice

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,) 

0
如果有多个条件和选项,我更倾向于
condition = [df.value.str[3:5]=='10']
choice= [df.value.str[:3]+'10'+df.value.str[5:]]
df.value= np.select(condition,choice,default=df.value)

#inspired by Beny

输出

  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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接