1. 程式人生 > >pandas常見用法總結

pandas常見用法總結

前言

Pandas是一個開放原始碼的Python庫,它使用強大的資料結構提供高效能的資料操作和分析工具。這篇文章以例項方式介紹了pandas的常見用法。

匯入

# pandas一般會與numpy配合使用
import pandas as pd 
import numpy as np 

DataFrame

由一系列的Series組成

# Series是DataFrame的一列
series_1 = pd.Series(1, 2, "3", "a")  # 建立Serise,它會自動給每個元素加上索引值,從0開始
series_1.index = ["a"
,"b","c","d"] # 修改索引值 series_1.drop["a"] # 刪 series_1["a"] = 4 # 改 series_1["a"] # 查

檢視資訊

# a是一個DataFrame

a.info() # 顯示資料資訊:列名、非空數量、資料型別等。

a.describe() # 可以得到數值型資料的一些分佈

a.head()  # 顯示資料(一般顯示前5行,可以在括號中指定顯示幾行)

a.tail()  # 顯示後幾行資料      

a.columns  # 顯示列名

a.shape  # 顯示形狀

建立一列資料

s =
pd.Series([1,np.nan,44]) print(s) 0 1.0 1 NaN 2 44.0 dtype: float64

建立一個數據表

df = pd.DataFrame(np.random.randn(6,4)) # 有索引       
print(df)
          0         1         2         3
0 -0.485819  1.465311 -0.874580 -0.801833
1 -1.195040  0.438705 -0.152660 -0.896882
2  0.601379  0.871732 -0.232300 -1.942046
3 -1.467846 0.985194 0.802487 1.073567 4 1.137115 1.414391 -0.194927 0.145966 5 0.403413 1.570771 1.883406 -0.559665

構建一個時間序列:從20181212開始的6天


dates = pd.date_range('20181212', periods=6) 
print(dates)
DatetimeIndex(['2018-12-12', '2018-12-13', '2018-12-14', '2018-12-15',
               '2018-12-16', '2018-12-17'],
              dtype='datetime64[ns]', freq='D')

構建一個有行名有列名的表

# index是用上述的時間序列作為行名,columns是列名
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=['a','b','c','d'])
print(df)
                   a         b         c         d
2018-12-12 -0.408206  0.690151 -0.255535 -0.825533
2018-12-13 -0.782994  0.846120 -2.369437 -0.563946
2018-12-14  0.592621  0.642034  0.631633  0.470060
2018-12-15 -1.716559  0.687173 -2.644728  0.084093
2018-12-16  0.010821 -0.669383  0.484277 -0.455398
2018-12-17 -0.686960  0.171372  0.501168  0.651696

輸出上表的資料型別

print(df.dtypes)
a    float64
b    float64
c    float64
d    float64
dtype: object

輸出上表的行名和列名

print(df.index) # 輸出行名
DatetimeIndex(['2018-12-12', '2018-12-13', '2018-12-14', '2018-12-15',
               '2018-12-16', '2018-12-17'],
              dtype='datetime64[ns]', freq='D')
             
print(df.columns) # 輸出列名
Index(['a', 'b', 'c', 'd'], dtype='object')

排序

print(df)
# axis=1是對第2個維度(列名)排序;axis=0是對第1個維度(行名)排序。
# ascending=False為倒序排序,預設為True正序。
print(df.sort_index(axis=1, ascending=False)) 
                   a         b         c         d
2018-12-12 -0.806089  0.660987 -0.137833 -0.724158
2018-12-13 -0.375285 -1.071433 -1.046819  0.414112
2018-12-14  0.377175 -0.751585  0.197294  0.048427
2018-12-15 -0.872873  0.154589 -0.225713  0.713596
2018-12-16 -0.028886  1.199271  0.306876 -0.268253
2018-12-17 -1.468384 -0.105490  1.179329 -1.655588
                   d         c         b         a
2018-12-12 -0.724158 -0.137833  0.660987 -0.806089
2018-12-13  0.414112 -1.046819 -1.071433 -0.375285
2018-12-14  0.048427  0.197294 -0.751585  0.377175
2018-12-15  0.713596 -0.225713  0.154589 -0.872873
2018-12-16 -0.268253  0.306876  1.199271 -0.028886
2018-12-17 -1.655588  1.179329 -0.105490 -1.468384


# 對特定的列排序
print(df.sort_values(by='a', ascending=True))
                   a         b         c         d
2018-12-17 -1.468384 -0.105490  1.179329 -1.655588
2018-12-15 -0.872873  0.154589 -0.225713  0.713596
2018-12-12 -0.806089  0.660987 -0.137833 -0.724158
2018-12-13 -0.375285 -1.071433 -1.046819  0.414112
2018-12-16 -0.028886  1.199271  0.306876 -0.268253
2018-12-14  0.377175 -0.751585  0.197294  0.048427

索引1

dates = pd.date_range('20181212',periods=6)
df = pd.DataFrame(np.arange(24).reshape([6,4]),index=dates, columns=['A','B','C','D'])
print(df)
             A   B   C   D
2018-12-12   0   1   2   3
2018-12-13   4   5   6   7
2018-12-14   8   9  10  11
2018-12-15  12  13  14  15
2018-12-16  16  17  18  19
2018-12-17  20  21  22  23

print(df['A']) # 同 df.A,檢索到特定一列
2018-12-12     0
2018-12-13     4
2018-12-14     8
2018-12-15    12
2018-12-16    16
2018-12-17    20
Freq: D, Name: A, dtype: int32

# 切片操作 
print(df[0:3]) # 同 df['20181212':'20181214'],索引或者行名都可以
            A  B   C   D
2018-12-12  0  1   2   3
2018-12-13  4  5   6   7
2018-12-14  8  9  10  11

檢索2

df.loc和df.iloc的用法:

print(df)
             A   B   C   D
2018-12-12   0   1   2   3
2018-12-13   4   5   6   7
2018-12-14   8   9  10  11
2018-12-15  12  13  14  15
2018-12-16  16  17  18  19
2018-12-17  20  21  22  23

# df.loc:以行名、列名檢索
print(df.loc['20181213']) # 檢索到特定一行
A    4
B    5
C    6
D    7
Name: 2018-12-13 00:00:00, dtype: int32

print(df.loc[:,['A','B']]) # 所有行的A、B列
             A   B
2018-12-12   0   1
2018-12-13   4   5
2018-12-14   8   9
2018-12-15  12  13
2018-12-16  16  17
2018-12-17  20  21

print(df.loc['20181212',['A','B']]) # 20181212行的A、B列
A    0
B    1
Name: 2018-12-12 00:00:00, dtype: int32

# df.iloc:以索引號(從0開始)檢索
print(df.iloc[3]) # 第三行
A    12
B    13
C    14
D    15
Name: 2018-12-15 00:00:00, dtype: int32

print(df.iloc[3,1]) # 第三行的第一列
13

print(df.iloc[3:5,1:3]) # 3-5行的1-3列
             B   C
2018-12-15  13  14
2018-12-16  17  18


print(df[df.A > 12]) # 找出A列大於12的行
             A   B   C   D
2018-12-16  16  17  18  19
2018-12-17  20  21  22  23

修改元素值

dates = pd.date_range('20181212',periods=6)
df = pd.DataFrame(np.arange(24).reshape([6,4]),index=dates, columns=['A','B','C','D'])
print(df)
             A   B   C   D
2018-12-12   0   1   2   3
2018-12-13   4   5   6   7
2018-12-14   8   9  10  11
2018-12-15  12  13  14  15
2018-12-16  16  17  18  19
2018-12-17  20  21  22  23

df.iloc[2,2] = 2222 # 將第二行第二列元素值改為2222
print(df)
             A   B     C   D
2018-12-12   0   1     2   3
2018-12-13   4   5     6   7
2018-12-14   8   9  2222  11
2018-12-15  12  13    14  15
2018-12-16  16  17    18  19
2018-12-17  20  21    22  23

df.loc['20181214','B'] = 6666 # 按行名列名改
             A     B     C   D
2018-12-12   0     1     2   3
2018-12-13   4     5     6   7
2018-12-14   8  6666  2222  11
2018-12-15  12    13    14  15
2018-12-16  16    17    18  19
2018-12-17  20    21    22  23

df[df.A>6]=222 # 把A列中所有大於6的行的值變為222
print(df)
              A    B    C    D
2018-12-12    0    1    2    3
2018-12-13    4    5    6    7
2018-12-14  222  222  222  222
2018-12-15  222  222  222  222
2018-12-16  222  222  222  222
2018-12-17  222  222  222  222

df.B[df.A>3]=999 # 再把A中所有大於3的B列值變為999
print(df)
              A    B    C    D
2018-12-12    0    1    2    3
2018-12-13    4  999    6    7
2018-12-14  222  999  222  222
2018-12-15  222  999  222  222
2018-12-16  222  999  222  222
2018-12-17  222  999  222  222

df['F'] = np.nan #新增一列 全為NaN
print(df)
              A    B    C    D   F
2018-12-12    0    1    2    3 NaN
2018-12-13    4  999    6    7 NaN
2018-12-14  222  999  222  222 NaN
2018-12-15  222  999  222  222 NaN
2018-12-16  222  999  222  222 NaN
2018-12-17  222  999  222  222 NaN

df['E'] = [1,2,3,4,5,6] # 再新增一列,給定值
print(df)
              A    B    C    D   F  E
2018-12-12    0    1    2    3 NaN  1
2018-12-13    4  999    6    7 NaN  2
2018-12-14  222  999  222  222 NaN  3
2018-12-15  222  999  222  222 NaN  4
2018-12-16  222  999  222  222 NaN  5
2018-12-17  222  999  222  222 NaN  6

NaN

pandas中缺失資料用NaN來表示。

dates = pd.date_range('20181212',periods=3)
df = pd.DataFrame(np.arange(12).reshape([3,4]),index=dates, columns=['A','B','C','D'])
df.iloc[0,1] = np.nan
df.iloc[1,3] = np.nan
print(df) 
            A    B   C     D
2018-12-12  0  NaN   2   3.0
2018-12-13  4  5.0   6   NaN
2018-12-14  8  9.0  10