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對象里面隱藏着若干組數據,但是沒有應用累計函數之前不會計算。
'data1':range(6),
'data2':rng.randint(0,10,6)},
columns=['key','data1','data2'])
print(df)
df.groupby('key')
(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數據科學手冊》