For Java,Python.

Python数据分析入门 - Pandas

2018.12.15

Pandas介绍

pandas可是说是numpy的升级版。 如果把numpy看作是一个list,那pandas就是一个dict

pandas安装

终端:sudo pip install pandas CMD:pip install pandas

引入pandas搭配numpy使用

import pandas as pd
import numpy as np

pandas数据类型Series

s = pd.Series(data,index,dtype,name,copy,fastpath)

各个属性默认为None或False

s = pd.Series([1,3,4,np.nan,1])
print(s)
0    1.0
1    3.0
2    4.0
3    NaN
4    1.0
dtype: float64
  • 自带index索引 这里的np.nan表示数据为空【无效值】

日期date_range类型

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

DataFrame类型【画个重点】

dates = pd.date_range('20181213',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-13   0   1   2   3
2018-12-14   4   5   6   7
2018-12-15   8   9  10  11
2018-12-16  12  13  14  15
2018-12-17  16  17  18  19
2018-12-18  20  21  22  23

如果不给index和columns值

dates = pd.date_range('20181213',periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)))
print(df)
	0	1	2	3
0	0	1	2	3
1	4	5	6	7
2	8	9	10	11
3	12	13	14	15
4	16	17	18	19
5	20	21	22	23

它会从0开始默认生成

  • 以一个字典形式生成DataFrame()
dates = pd.date_range('20181213',periods=6)
df = pd.DataFrame({
        '01':101.,
        '02':pd.date_range('20181213',periods=6),
        '03':np.array([3]*6,dtype='int32'),
        '04':'str'
    })
print(df)
      01         02  03   04
0  101.0 2018-12-13   3  str
1  101.0 2018-12-14   3  str
2  101.0 2018-12-15   3  str
3  101.0 2018-12-16   3  str
4  101.0 2018-12-17   3  str
5  101.0 2018-12-18   3  str

· 注意:当其中一个键的值只有一个时,它会自动补齐最高的,但是如果键有两个及两个以上的值且两个键长度不统一就会报错

arrays must all be same length
  • 查看这个DataFrame()全部列的数据类型
dates = pd.date_range('20181213',periods=6)
df = pd.DataFrame({
        '01':101.,
        '02':pd.date_range('20181213',periods=6),
        '03':np.array([3]*6,dtype='int32'),
        '04':'str'
    })
print(df.dtypes)
01           float64
02    datetime64[ns]
03             int32
04            object
dtype: object
  • 查看这个DataFrame()全部行的序号
dates = pd.date_range('20181213',periods=6)
df = pd.DataFrame({
        '01':101.,
        '02':pd.date_range('20181213',periods=6),
        '03':np.array([3]*6,dtype='int32'),
        '04':'str'
    })
print(df.index)
RangeIndex(start=0, stop=6, step=1)
  • 转置操作:相当于翻转矩阵,旋转90°
dates = pd.date_range('20181213',periods=6)
print(dates.T)
DatetimeIndex(['2018-12-13', '2018-12-14', '2018-12-15', '2018-12-16',
               '2018-12-17', '2018-12-18'],
              dtype='datetime64[ns]', freq='D')

pandas设置值

-  用.iloc[]和loc[]来定位值的位置 [可以按行输入并打印查看效果]
dates = pd.date_range('20181213',periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])

df.iloc[2,2] = 111
df.loc['20181213','B'] = 222
df[df.A>0] = 0 #df.A中所有大于0的数全部改为 0
df['F'] = np.nan
print(df)

处理丢失、无效数据

  • 丢掉数据
  • 替换数据
  • 判断是否缺失值

丢掉数据

dates = pd.date_range('20181213',periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates,columns=['A','B','C','D'])
df.iloc[0,1] = np.nan
df.iloc[1,2] = np.nan

print(df)
             A     B     C   D
2018-12-13   0   NaN   2.0   3
2018-12-14   4   5.0   NaN   7
2018-12-15   8   9.0  10.0  11
2018-12-16  12  13.0  14.0  15
2018-12-17  16  17.0  18.0  19
2018-12-18  20  21.0  22.0  23
print(df.dropna(axis=0,how='any')) #丢失含有无效项的行 how={'any':'all'} 
# how为any时,只要行中有无效项就丢失整行。相反all时,要一行所有的项都为无效值则丢失整行。

填充数据

print(df.fillna(value=0)) 
             A     B     C   D
2018-12-13   0   0.0   2.0   3
2018-12-14   4   5.0   0.0   7
2018-12-15   8   9.0  10.0  11
2018-12-16  12  13.0  14.0  15
2018-12-17  16  17.0  18.0  19
2018-12-18  20  21.0  22.0  23

判断是否缺失值

print(df.isnull()) #缺失为True
print(np.any(df.isnull()) == True) #当数据量大无法观察到True或False时使用,会返回True或False告诉你数据中是否还存在丢失值。
                A      B      C      D
2018-12-13  False   True  False  False
2018-12-14  False  False   True  False
2018-12-15  False  False  False  False
2018-12-16  False  False  False  False
2018-12-17  False  False  False  False
2018-12-18  False  False  False  False
True

Pandas导入导出数据

pandas可以读取与存取的资料格式有很多种,像csv、excel、json、html与pickle等,点这里查看官方说明文件

本文引用文件下载:student.csv

  • 导入读取csv
import pandas as pd 
import numpy as np

data = pd.read_csv('student.csv')# 其他参数可以参照官方说明文档来决定,使用哪些参数。
print(data)
      id      name  age grade
0   1001       Bob   21     B
1   1002     Linda   22     A
2   1003  Xiaoming   25     D
3   1004     David   23     E
4   1005      Coco   24     C
5   1006         M   19     C
6   1007         N   20     A
7   1008         O   22     D
8   1009         S   23     B
9   1010     Kelly   31     S
10  1011     Kitty   21     A
11  1012       Tom   23     C
12  1013     Tonny   22     D
13  1014         W   21     E

pandas会默认给你在第一行后添加索引。

  • 导出写入csv
data.to_pickle('student.pickle')