Python 數(shù)據(jù)分析:Pandas 數(shù)據(jù)操作(一)
在掌握了Pandas的數(shù)據(jù)結(jié)構(gòu)后,接下來應該學會如何操作數(shù)據(jù)?,F(xiàn)在讓我們來看看在Pandas中如何定位和操作數(shù)據(jù)。
1. 一般操作
首先,我們應該知道當某個變量名指向Pandas數(shù)據(jù)時(或者理解為Pandas格式數(shù)據(jù)賦值給變量),其對應就可以使用Pandas的方法,這是類的特性。
# Series數(shù)據(jù)格式賦值給變量s
s = pd.Series([1,2,3])
# DataFrame數(shù)據(jù)格式賦值給變量df
df = pd.DataFrame([[1,2],[3,4]],columns=['a','b'])
通過上面的賦值后,變量s、df就各自獲得了對于Pandas數(shù)據(jù)格式的操作方法。可以使用head()、tail()方法查看其數(shù)據(jù)的前或后5條記錄。
>>>s.head()
01
12
23
dtype: int64
>>>df.head()
ab
01 2
1 3 4
對于不同的數(shù)據(jù)格式,可以通過index和column定位到元素。一般通過.iloc[]切片方法定位,不同的軸在方括號內(nèi)用逗號隔開。如下:
>>> s.iloc[1] # Series的具體元素
2
>>> s.iloc[1:] # Series的連續(xù)元素切片
1 2
2 3
dtype: int64
>>> df.iloc[1,1] # DataFrame的具體元素
4
>>> df.iloc[1,:] # DataFrame的某行切片(Series),也可以多行(DataFrame)
a 3
b 4
Name: 1, dtype: int64
>>> df.iloc[:,0] # DataFrame的某列切片(Series),也可以多行(DataFrame)
0 1
1 3
Name: a, dtype: int6
這里要注意,Series數(shù)據(jù)格式是一維數(shù)據(jù),只有index索引;DataFrame數(shù)據(jù)格式是二維數(shù)據(jù),有index和column索引。.iloc[]方法一般是按照自然數(shù)索引定位數(shù)據(jù)的,有時我們明確知道index、column的索引值,希望用具體的索引值定位,這時我們可以用.loc[]方法。
>>> df.loc[1,'b'] # DataFrame的具體元素
4
>>> df.loc[1,:] # DataFrame的某行切片(Series),也可以多行(DataFrame)
a 3
b 4
Name:1, dtype: int64
>>> df.loc[:,'b'] # DataFrame的某列切片(Series),也可以多行(DataFrame)
02
14
Name: b, dtype: int64
到這里,我們已經(jīng)知道如何使用.iloc[]、.loc[]方法進行元素、切片處理,另外,要記住方括號內(nèi)是接受python切片風格的。
可以通過shape屬性,查看其大小。
>>> s.shape
(3,)
>>> df.shape
(2, 2)
可以通過dtypes屬性,查看變量類型。
>>> s.dtypes
dtype('int64')
>>> df.dtypes
a int64
b int64
dtype: object
可以通過decribe()方法,查看變量的簡單描述統(tǒng)計。默認會列出元素數(shù)量,平均值,標準差,極值和四分位數(shù)。
>>> s.describe()
count 3.0
mean 2.0
std 1.0
min 1.0
25% 1.5
50% 2.0
75% 2.5
max 3.0
dtype: float64
>>> df.describe()
ab
count 2.000000 2.000000
mean 2.000000 3.000000
std 1.414214 1.414214
min 1.000000 2.000000
25% 1.500000 2.500000
50% 2.000000 3.000000
75% 2.500000 3.500000
max 3.000000 4.000000
2. 篩選
對于數(shù)據(jù)篩選,這里直接通過案例進行講解。首先生成100條數(shù)據(jù),然后按照需求篩選數(shù)據(jù)。
# 生成演示數(shù)據(jù)
>>> s = pd.Series(np.random.random(100))
>>> df = pd.DataFrame(np.random.random(200).reshape(100,2),
... columns=['a','b'])
# 篩選s中>0.95的數(shù)據(jù)
>>> s[s>0.95]
40.954258
90.975997
110.997384
190.970825
400.961048
930.971340
dtype: float64
# 篩選df中'a'列元素值>0.95的行
>>> df[df['a']>0.95]
a b
160.9627330.817430
290.9995350.549727
510.9953340.097591
540.9522940.138212
940.9851170.959374
# 篩選df中'a'列元素值不小于0.95的行
>>> df[~(df['a']<=0.95)]
a b
160.9627330.817430
290.9995350.549727
510.9953340.097591
540.9522940.138212
940.9851170.959374
# 篩選df中'a'或'b'列元素值>0.95的行
>>> df[(df['a']>0.95) | (df['b']>0.95)]
a b
6 0.445481 0.958583
16 0.962733 0.817430
29 0.999535 0.549727
37 0.501890 0.960820
51 0.995334 0.097591
54 0.952294 0.138212
59 0.357409 0.983461
94 0.985117 0.959374
# 篩選df中'a'和'b'列元素值均>0.9的行
>>> df[(df['a']>0.9) & (df['b']>0.9)]
a b
94 0.985117 0.959374
要篩選某個pandas變量中的元素,只需要在變量后面加方括號,并在括號內(nèi)寫入條件即可。這里要注意,多個條件時應將每個條件用圓括號括起來,之間可以用與&、或|、非~連接。
3. 修改
對于數(shù)據(jù)修改,這里直接通過案例進行講解。首先生成5條數(shù)據(jù),然后按照需求修改數(shù)據(jù)。
# 生成演示數(shù)據(jù)
>>> df = pd.DataFrame(np.random.random(10).reshape(5,2),
... columns=['a','b'])
>>> df
a b
00.4985220.895257
10.056069 0.873136
20.7289030.627868
30.3203840.909901
40.1754440.284480
# 將b列的數(shù)據(jù)修改為1
>>> df['b']=1
>>> df
a b
00.4985221
10.056069 1
20.7289031
30.3203841
40.1754441
# 將b列的數(shù)據(jù)修改為a列的10倍數(shù)
>>> df['b']=df['a']*10
>>> df
a b
00.4985224.985216
10.056069 0.560688
20.7289037.289034
30.3203843.203838
40.1754441.754438
# 如果a列的值>0.5,則b列值為1,否則為0。
>>> df['b']=df.apply(lambda x:1 if x['a']>0.5 else 0,axis='columns')
>>> df
a b
00.4985220
10.056069 0
20.7289031
30.3203840
4 0.175444 0
上述數(shù)據(jù)修改的方法要重點掌握apply(),它可以接受函數(shù)處理數(shù)據(jù)。這里是用了1個匿名函數(shù)(,并按照columns軸進行數(shù)據(jù)分析,然后賦值給b列。