如何在不影响其他字符的情况下替换 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
它正在用新值替换整个值。谁能帮我解决这个问题。 谢谢!
最佳答案
data['value'].str[3:5].replace('10','00')
返回由每个字符串组成的 pd.Series
由 [3:5]
切片,并在每一行中应用 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
对于您的情况,最后一个解决方案不如第一个解决方案明确。
关于python - 如何使用 python pandas 替换列中的特定数字。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51295980/