Python——DataFrame基礎操作


DataFrame理解

DataFrame可以看做是有序排列的若干Series對象,這里的“排列”是指這些Series都有共同的索引。

一、讀取文件

dt = pd.read_csv(path)
dt = pd.read_excel(path)
dt = pd.read_table(path, sep=',')

 

二、索引

第一類索引是iloc屬性,表示取值和切片都是顯式的,dt.iloc[1:3] #注:從0開始的左閉右開區間

第二類索引是loc屬性,表示索引是隱式的,如dt.loc[:'Illinois', :'pop']

第三種索引ix可實現一種混合效果,如dt.ix[:3, :'pop']

 

三、合並與連接

1、pd.concat()

 

pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
                keys=None, levels=None)

其中,axis=0是按照行合並,axis=1是按列合並(也可寫成axis='col')。axis=1時是按照索引合並的。

ser1 = pd.Series(['A','B','C'])
ser2 = pd.Series(['D','E','F'])
ser3 = pd.Series(['G','H','I'])

a = pd.concat([ser1,ser2])

a的結果如下,如果直接按列合並ser3,就會報錯。

0    A
1    B
2    C
0    D
1    E
2    F
dtype: object

pd.concat([a, ser3], axis=1)

InvalidIndexError: Reindexing only valid with uniquely valued Index objects

因為此時a的索引是保留原本的兩個Series的Index的,可通過設置ignore_index=True,重置索引,

2、 pd.append()

ser1.append(ser2)

Pandas的append()不直接更新原有對象的值,而是為合並后的數據創建一個新對象。

3、pd.merge()

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False,
     sort=False, suffixes=('_x', '_y'), copy=True, indicator=False)

 

詳見help(pd.merge)

 

四、分組(Gruopby)

分組統計時需要使用到groupby方法,其原理是通過分割(split)、應用(apply)和組合(combine)得到結果。

Groupby是對數據按照指定列進行分割,返回一個DataFrameGroupBy對象。DataFrameGroupBy對象里面隱藏着若干組數據,但是沒有應用累計函數之前不會計算。

import numpy as np
rng = np.random.RandomState(0)
df = pd.DataFrame({'key':['A','B','C','A','B','C'],
                  'data1':range(6),
                  'data2':rng.randint(0,10,6)},
                 columns=['key','data1','data2'])

print(df)
df.groupby('key')
 
  key  data1  data2
0   A      0      5
1   B      1      0
2   C      2      3
3   A      3      3
4   B      4      7
5   C      5      9
Out[15]:
<pandas.core.groupby.DataFrameGroupBy object at 0x000001D9BC42A860>

(1)聚合aggregate

應用函數后會對DataFrameGroupBy對象展開計算。

df.groupby('key').aggregate(['min',np.median,max])
data1 data2
  min median max min median max
key            
A 0 1.5 3 3 4.0 5
B 1 2.5 4 0 3.5 7
C 2 3.5 5 3 6.0 9

 還可以通過字典指定不同列需要的函數

df.groupby('key').aggregate({'data1':'min',
                            'data2':'max'})
data1 data2
key    
A 0 5
B 1 7
C 2 9

 (2)過濾filter

def filter_func(x):
    return x['data2'].std() > 4

print(df.groupby('key').std())
print(df.groupby('key').filter(filter_func))

 

  data1 data2
key    
A 2.12132 1.414214
B 2.12132 4.949747
C 2.12132 4.242641

 

  key data1 data2
1 B 1 0
2 C 2 3
4 B 4 7
5 C 5 9

(3)轉換transform

df.groupby('key').transform(lambda x:x-x.mean())
data1 data2
0 -1.5 1.0
1 -1.5 -3.5
2 -1.5 -3.0
3 1.5 -1.0
4 1.5 3.5
5 1.5 3.0

 

五、數據透視表

詳見help(pd.pivot_table)

titanic.pivot_table('survived', index='sex', columns='class', aggfunc={'survived':sum, 'fare':'mean'})

 

六、其他操作(排序、去重、計算及按行列應用函數等)

1、排序

按照索引排序

df.sort_index(ascending=False)
  key data1 data2
5 C 5 9
4 B 4 7
3 A 3 3
2 C 2 3
1 B 1 0
0 A 0 5

 按照值排序

df.sort_values(by=['key','data2'])
key data1 data2
3 A 3 3
0 A 0 5
1 B 1 0
4 B 4 7
2 C 2 3
5 C 5 9

2、去重

df.drop_duplicates('data2', keep='first')
key data1 data2
0 A 0 5
1 B 1 0
2 C 2 3
4 B 4 7
5 C 5 9

想要知道某一列有多少個不重復的元素可以用df['data1'].nunique()

3、刪除Drop

按照行刪除

先選出需要刪除的行的index,再刪除指定index

df.drop(df.loc[df['key']=='A'].index, axis=0)
key data1 data2
1 B 1 0
2 C 2 3
4 B 4 7
5 C 5 9

按照列刪除

df.drop(['key','data2'], axis=1) 

 

 

參考:《Python數據科學手冊》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM