Python数据分析[3] - Pandas包

Series

Series是一个一维的向量,每个值都会有对应标签,该标签我们称之为Index

Obj = Series([4, 5, -7, 8])

Obj
Out[5]: 
0    4
1    5
2   -7
3    8
dtype: int64

Obj2 = Series([4, 5, -7, 8], index = ['a', 'b', 'c', 'd'])

Obj2
Out[7]: 
a    4
b    5
c   -7
d    8
dtype: int64

通过Index可以对Series进行查询以及修改

Obj2['a']
Out[12]: 4

Obj2['a'] = 0

Obj2
Out[14]: 
a    0
b    5
c   -7
d    8
dtype: int64

Numpy函数,以及其他类Numpy的向量计算函数,可以应用在Series中,与Numpy的ndarrays基本相同

Obj * 2
Out[16]: 
0     8
1    10
2   -14
3    16
dtype: int64

python的dict数据可以直接转换为Series

sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
obj3 = pd.Series(sdata)

obj3
Out[17]: 
Ohio      35000
Texas     71000
Oregon    16000
Utah       5000
dtype: int64

DataFrame

DataFrame是我作为数据分析师,最为常用的一个数据类型。DataFrame代表了一个长方形的表,包含了任意的长度及宽度(可以理解为在Excel中的一个表)。DataFrame拥有Column Index和Row Index(行标与列标)。
最常见的创建DataFrame的方法为从一个包含了Numpy arrays的dict数据转换

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],        
       'year': [2000, 2001, 2002, 2001, 2002, 2003],        
       'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]} 
frame = pd.DataFrame(data)

frame
Out[19]: 
    state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2002  2.9
5  Nevada  2003  3.2

在创建通过表头的名字,我们可以更换列的顺序

frame = pd.DataFrame(data, columns = ['year', 'state', 'pop'])

frame
Out[21]: 
   year   state  pop
0  2000    Ohio  1.5
1  2001    Ohio  1.7
2  2002    Ohio  3.6
3  2001  Nevada  2.4
4  2002  Nevada  2.9
5  2003  Nevada  3.2

创建完成后,可以选择使用列名查询某列

frame['pop']
Out[22]: 
0    1.5
1    1.7
2    3.6
3    2.4
4    2.9
5    3.2

loc方法可以查询某行

frame.loc[1]
Out[23]: 
year     2001
state    Ohio
pop       1.7
Name: 1, dtype: object

直接指定好列名以及对应的行,便可以很便利的向pandas添加数据,空的数据会在pandas中展示为NaN

frame['city'] = Series(['Kent', 'Las Vegas'], index = [0, 3])

frame
Out[25]: 
   year   state  pop       city
0  2000    Ohio  1.5       Kent
1  2001    Ohio  1.7        NaN
2  2002    Ohio  3.6        NaN
3  2001  Nevada  2.4  Las Vegas
4  2002  Nevada  2.9        NaN
5  2003  Nevada  3.2        NaN
Pandas方法

使用loc和iloc可以对一个dataframe执行分页操作
loc为选取该名字的行与列,iloc为选取第x行和第y列

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],        
       'year': [2000, 2001, 2002, 2001, 2002, 2003],        
       'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]} 
frame = pd.DataFrame(data, index = ['one', 'two', 'three', 'four', 'five', 'six'])

frame
Out[34]: 
        state  year  pop
one      Ohio  2000  1.5
two      Ohio  2001  1.7
three    Ohio  2002  3.6
four   Nevada  2001  2.4
five   Nevada  2002  2.9
six    Nevada  2003  3.2

frame.loc[['two', 'three'], ['state', 'year']]
Out[37]: 
      state  year
two    Ohio  2001
three  Ohio  2002

frame.iloc[[2, 3], [0, 1]]
Out[38]: 
        state  year
three    Ohio  2002
four   Nevada  2001

DataFrame 计算与缺失值

DataFrame基础计算方法包括了加、减、乘、除、次方、整除等


计算方法

在计算方法中,fill_value值可以控制缺失值的替换

df1 = DataFrame(np.arange(12.).reshape(3, 4), columns = list('abcd'))
df2 = DataFrame(np.arange(15.).reshape(3, 5), columns = list('abecd'))

df1
Out[59]: 
     a    b     c     d
0  0.0  1.0   2.0   3.0
1  4.0  5.0   6.0   7.0
2  8.0  9.0  10.0  11.0

df2
Out[60]: 
      a     b     e     c     d
0   0.0   1.0   2.0   3.0   4.0
1   5.0   6.0   7.0   8.0   9.0
2  10.0  11.0  12.0  13.0  14.0

df1 + df2
Out[61]: 
      a     b     c     d   e
0   0.0   2.0   5.0   7.0 NaN
1   9.0  11.0  14.0  16.0 NaN
2  18.0  20.0  23.0  25.0 NaN

df1.add(df2, fill_value = 0)
Out[62]: 
      a     b     c     d     e
0   0.0   2.0   5.0   7.0   2.0
1   9.0  11.0  14.0  16.0   7.0
2  18.0  20.0  23.0  25.0  12.0

除此之外reindex可以调整一个dataframe的shape,例如df1可以添加一行与df2保持一致

df1.reindex(columns = df2.columns, fill_value = 0)
Out[63]: 
     a    b  e     c     d
0  0.0  1.0  0   2.0   3.0
1  4.0  5.0  0   6.0   7.0
2  8.0  9.0  0  10.0  11.0

函数应用以及mapping

NumPy的ufuncs(向量化函数)是可以在DataFrame中应用的
例如我们定义一个函数,求该行的范围(最大值与最小值的绝对差)

frame
Out[152]: 
          b     d     e
Utah    0.0   1.0   2.0
Ohio    3.0   4.0   5.0
Texas   6.0   7.0   8.0
Oregon  9.0  10.0  11.0

get_range = lambda x: x.max() - x.min()

frame.apply(get_range)
Out[154]: 
b    9.0
d    9.0
e    9.0
dtype: float64

frame.apply(get_range, axis = 'columns')
Out[158]: 
Utah      2.0
Ohio      2.0
Texas     2.0
Oregon    2.0
dtype: float64

创建描述性统计函数

data = pd.DataFrame(np.random.randn(1000, 4))

data
Out[296]: 
            a         b         c         d
0    0.660991  1.166362 -0.282237 -0.061292
1   -0.815670  0.220678 -0.072469 -0.343580
2   -1.431911  0.824215 -0.915729 -0.659971
3    0.696466 -0.556472  0.129206  0.739566
4   -1.475857 -0.043149 -1.839006  0.099850
..        ...       ...       ...       ...
995  0.135430  0.923296 -0.819932 -0.876656
996  1.767997  1.747973 -0.609283 -0.608092
997 -0.239235  0.376930  0.154019  0.660505
998  0.202736 -0.214131  0.926638 -0.810888
999 -0.144855 -0.463251  0.984850  1.368218

[1000 rows x 4 columns]

def statistical_describe(DataFrame_input) -> DataFrame:
    return DataFrame_input.apply(lambda x: pd.Series([len(x), sum(x)/len(x), 
                                               (sum((x - sum(x)/len(x))**2)/len(x))**.5,
                                               x.min(), x.quantile(.25), x.quantile(.5), x.quantile(.75), x.max()],
                                              index = ['count', 'mean', 'std', 'min', '.25', '.50', '.75', 'max']))



statistical_describe(data)
Out[297]: 
                 a            b            c            d
count  1000.000000  1000.000000  1000.000000  1000.000000
mean      0.035889     0.031281    -0.005168    -0.063525
std       1.035586     0.978126     0.975315     0.994380
min      -3.068035    -3.513137    -3.373269    -3.251473
.25      -0.643046    -0.594430    -0.664430    -0.749127
.50       0.006002     0.051688    -0.010682    -0.087670
.75       0.714898     0.715789     0.663933     0.605968
max       3.790818     3.867886     2.673977     3.488003

你可能感兴趣的:(Python数据分析[3] - Pandas包)