環(huán)境
- Anaconda notebook
- Python 3.6
- pandas 0.20.0
問題:
篩選出符合某些條件的行以后跷叉,對這些行里面的某一列進行數(shù)值修改時仆百,如果直接使用 data[篩選條件][某一列] = 值
會出現(xiàn)錯誤举畸,因為這是對切片拷貝進行操作箕别。因此和簸,需要使用 .loc[]
來解決篩選彭雾、并原地修改數(shù)值的問題。
1 準(zhǔn)備數(shù)據(jù)
把下列內(nèi)容填入 Sublime Text 等編輯器锁保,另存為 test.csv 文件薯酝。
id,sex,age
1,male,11
2,female,
3,female,31
4,male,21
5,male,
2 讀入數(shù)據(jù)
import pandas
data = pd.read_csv('test.csv')
查看讀入的數(shù)據(jù)
data
得到
id | sex | age | |
---|---|---|---|
0 | 1 | male | 11.0 |
1 | 2 | female | NaN |
2 | 3 | female | 31.0 |
3 | 4 | male | 21.0 |
4 | 5 | male | NaN |
3 是否使用 .loc[]
的區(qū)別
假設(shè),我們需要篩選出所有的男性(sex=male)爽柒,并將其 id 改為 100吴菠。
3.1 沒有使用 .loc[]
的情況
如果我們沒有使用 .loc[]
,直接使用 []
進行數(shù)據(jù)切片選擇浩村,并對其賦值做葵,就會產(chǎn)生錯誤。
# 設(shè)置篩選條件:選擇 sex 為 male
mask = (data['sex']=='male')
# 查看篩選情況心墅,選出了 sex 為 male 的數(shù)據(jù)
data[mask]
id | sex | age | |
---|---|---|---|
0 | 1 | male | 11.0 |
3 | 4 | male | 21.0 |
4 | 5 | male | NaN |
對其賦值
data[mask]['id'] = 100
出現(xiàn)警告酿矢,稱切片僅僅是拷貝,不能對其賦值怎燥,需要 .loc[row_indexer,col_indexer] = value
賦值
/Users/mac/anaconda/lib/python3.6/site-packages/ipykernel_launcher.py:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
"""Entry point for launching an IPython kernel.
3.2 使用 .loc[,]
賦值瘫筐,成功
使用方法是
data.loc[篩選條件, 賦值列名] = 值
對 test.csv 操作:篩選出所有的男性(sex=male),并將其 id 改為 100铐姚。
# 設(shè)置篩選條件:選擇 sex 為 male
mask = (data['sex']=='male')
# .loc[] 賦值
data.loc[mask, 'id'] = 100
結(jié)果:
id | sex | age | |
---|---|---|---|
0 | 100 | male | 11.0 |
1 | 2 | female | NaN |
2 | 3 | female | 31.0 |
3 | 100 | male | 21.0 |
4 | 100 | male | NaN |