python pandas替换某值
import pandas as pd
chengji=[['优',95,100,99],['良',98,99,100],['可',95,98,88],['可',98,95,87],['劣',85,96,85],['优',94,93,91]]
data=pd.DataFrame(chengji,columns=['语文','类别','数学','政治'])
data1=data.copy(deep=True)
print("-"*50,'replace方法,只替换100')
data1['数学'] = data1['数学'].replace(100,"优+")
print(data1)
print("-"*50,'replace方法,替换96-100')
data1['数学'] = data1['数学'].replace([100,99,98,97,96],"优")
print(data1)
print("-"*50,'replace方法,替换小于95')
print("-"*50,'批量修改类型')
data1 = data.copy(deep=True)
data1['数学'] = data1['数学'].apply(lambda x: "优+" if x == 100 else x)
data1['数学'] = data1['数学'].apply(lambda x: "优" if isinstance(x, (int, float)) and x > 95 else x)
data1['数学'] = data1['数学'].apply(lambda x: "良" if isinstance(x, (int, float)) and x <= 95 else x)
print(data1)
print("-"*50,'映射字典方法')
food = {100:'优',99:'优-',98:'良',97:'可'}
data1=data.copy(deep=True)
data1['数学'] = data1['数学'].replace(food)
print(data1)
print(data)
print("-"*50,'map方法')
data1=data
data1['数学'] = data1['数学'].map(food)
print(data1)
-------------------------------------------------- replace方法,只替换100
语文 类别 数学 政治
0 优 95 优+ 99
1 良 98 99 100
2 可 95 98 88
3 可 98 95 87
4 劣 85 96 85
5 优 94 93 91
-------------------------------------------------- replace方法,替换96-100
语文 类别 数学 政治
0 优 95 优+ 99
1 良 98 优 100
2 可 95 优 88
3 可 98 95 87
4 劣 85 优 85
5 优 94 93 91
-------------------------------------------------- replace方法,替换小于95
映射替换pandas.py:18: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
data1.loc[:,‘数学’][data1[‘数学’]<=95]=“良”
<class ‘pandas.core.series.Series’> 0 100
1 99
2 98
3 良
4 96
5 良
Name: 数学, dtype: object
语文 类别 数学 政治
0 优 95 100 99
1 良 98 99 100
2 可 95 98 88
3 可 98 良 87
4 劣 85 96 85
5 优 94 良 91
-------------------------------------------------- 替换小于95
语文 类别 数学 政治
0 优 95 优+ 99
1 良 98 优 100
2 可 95 优 88
3 可 98 良 87
4 劣 85 优 85
5 优 94 良 91
-------------------------------------------------- 映射字典方法
语文 类别 数学 政治
0 优 95 优 99
1 良 98 优- 100
2 可 95 良 88
3 可 98 95 87
4 劣 85 96 85
5 优 94 93 91
语文 类别 数学 政治
0 优 95 100 99
1 良 98 99 100
2 可 95 98 88
3 可 98 95 87
4 劣 85 96 85
5 优 94 93 91
-------------------------------------------------- map方法
语文 类别 数学 政治
0 优 95 优 99
1 良 98 优- 100
2 可 95 良 88
3 可 98 NaN 87
4 劣 85 NaN 85
5 优 94 NaN 91
可以看出,对于多对一,一对一的映射替换,用replace和字典的方法比较好,用map时,不存在映射时,会把没映射到的替换成NAN,看各自的用途吧
其中这个会出错,可以用下面的进行更改
data1=data.copy(deep=True)
data1.loc[:,'数学'][data1['数学']<=95]="良"
print(data1)
#上例的正确写法
data1=data.copy(deep=True)
data1.loc[data1['数学']<=95,'数学']="良"
print(data1)