前面我们介绍了numpy的简单使用,今天我们使用pandas来筛选数据和处理缺失值问题。
一:首先我们需要导入pandas和numpy模块
# 一般 pandas 和 numpy 都是配合在一起使用的
import pandas as pd
import numpy as np
二:首先我们使用pandas的Series()来创建
# index定义行的名称,默认从0~(N-1),N表示列表的长度
s = pd.Series([1,3,5,54,np.nan,9], index=[1,3,5,7,9,11])
"""
0 1.0
3 3.0
5 5.0
7 54.0
9 NaN
11 9.0
dtype: float64
"""
二 : 使用pd的date_range()创建一个时间索引
dates = pd.date_range("20170101",periods=10)
"""
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
'2017-01-05', '2017-01-06', '2017-01-07', '2017-01-08',
'2017-01-09', '2017-01-10'],
dtype='datetime64[ns]', freq='D')
"""
三 : 下面我们开始创建测试数据
1:创建 DataFrame对象
df = pd.DataFrame(np.arange(20).reshape((5,4)),index=pd.date_range("20170101", periods=5),columns=['A','B','C','D'])
"""
A B C D
2017-01-01 0 1 2 3
2017-01-02 4 5 6 7
2017-01-03 8 9 10 11
2017-01-04 12 13 14 15
2017-01-05 16 17 18 19
"""
2:另一种创建方式
df2 = pd.DataFrame({
'A':[i for i in range(4)],
'B':pd.Timestamp('20170102'),
'C':pd.Series([i for i in range(4)],index=pd.date_range("20170101", periods=4),dtype='float32'),
'D':pd.Categorical(["test","train","test","train"])
})
3 : 使用sort_index()对索引名称进行排序
# axis = 1 表示对列排序
# sacending = False 表示降序, 默认为True
print(df.sort_index(axis=1, ascending=False))
"""
D C B A
2017-01-01 3 2 1 0
2017-01-02 7 6 5 4
2017-01-03 11 10 9 8
2017-01-04 15 14 13 12
2017-01-05 19 18 17 16
"""
4 : 使用sort_values()对值进行排序
print(df.sort_values(by="D",ascending=False))
"""
A B C D
2017-01-05 16 17 18 19
2017-01-04 12 13 14 15
2017-01-03 8 9 10 11
2017-01-02 4 5 6 7
2017-01-01 0 1 2 3
"""
5 :通过标签名筛选数据 : loc
# 获取某一行的数据
d = df.loc["20170101"]
print(d)
"""
A 0
B 1
C 2
D 3
Name: 2017-01-01 00:00:00, dtype: int32
"""
# 获取某一个数据
df.loc["20170102"]["A"] # 4
# 返回某一行的某几列数据
print(df.loc["20170101",["A","B"]])
"""
A 0
B 1
Name: 2017-01-01 00:00:00, dtype: int32
"""
# 获取所有行的某几列
print([:,["A","B"]])
"""
A B
2017-01-01 0 1
2017-01-02 4 5
2017-01-03 8 9
2017-01-04 12 13
2017-01-05 16 17
"""
6 : 通过索引筛选数据:iloc
print(df.iloc[1:3,1:3]) # 筛选1到3行(不包含第三行),1到3列(不包含第三列)的数据
"""
B C
2017-01-02 5 6
2017-01-03 9 10
"""
7 : 混合筛选数据 : ix
print(df.ix[:2,["A","C"]]) # 筛选前2行(不包含末尾),A列,C列数据
"""
A C
2017-01-01 0 2
2017-01-02 4 6
"""
接下来我们来使用Pandas处理缺失值
一:定义一个序列
s = pd.Series([
1,3,5,7,45,
11,23,np.nan,34,
np.nan,23,12,34,
11,np.nan,np.nan,34
])
# 输出序列中有多少Nan的值
count = sum(pd.isnull(s))
print(count) # 4
二:直接删除缺失值
# 定义一个DataFrame对象
df = pd.DataFrame([
[1,23,45,33],
[12,34,np.nan,28],
[32,np.nan,90,np.nan],
], columns=["A","B","C","D"])
print(df)
"""
A B C D
0 1 23.0 45.0 33.0
1 12 34.0 NaN 28.0
2 32 NaN 90.0 NaN
"""
# 直接删除缺省值
df = df.dropna() # 默认情况下(axis=0, how="any")只要行中存在有nan值,该行就会被删除
"""
A B C D
0 1 23.0 45.0 33.0
"""
df = df.dropna(axis=1, how="all") # 删除全部是nan的列,没有满足的条件因此没有删除
"""
A B C D
0 1 23.0 45.0 33.0
1 12 34.0 NaN 28.0
2 32 NaN 90.0 NaN
"""
df = df.drop("A", axis=1) # 删除A列
"""
B C D
0 23.0 45.0 33.0
1 34.0 NaN 28.0
2 NaN 90.0 NaN
"""
df =df.drop([0,1]) # 删除0,1两行数据
"""
A B C D
2 32 NaN 90.0 NaN
"""
三 : 填充缺失值
df = df.fillna(0) # 使用 0 来替换nan的值
"""
A B C D
0 1 23.0 45.0 33.0
1 12 34.0 0.0 28.0
2 32 0.0 90.0 0.0
"""
#采用前项填充或后项填充
# 后项填充 等价于 df.fillna(method="bfill")
df = df.bfill() # meth:`DataFrame.fillna(method='bfill') <DataFrame.fillna>`
"""
A B C D
0 1 23.0 45.0 33.0
1 12 34.0 90.0 28.0
2 32 NaN 90.0 NaN
"""
# 前项填充
df = df.fillna(method="ffill")
"""
A B C D
0 1 23.0 45.0 33.0
1 12 34.0 45.0 28.0
2 32 34.0 90.0 28.0
"""
# 使用常亮填充不同列
df = df.fillna({"A":1, "B":2, "C":3, "D":4})
"""
A B C D
0 1 23.0 45.0 33.0
1 12 34.0 3.0 28.0
2 32 2.0 90.0 4.0
"""
# 使用均值或中位数填充各自的列
A_median = df["A"].median()
B_median = df["B"].median()
C_median = df["C"].median()
D_median = df["D"].median()
print(A_median, B_median, C_median, D_median)
# 12.0 28.5 67.5 30.5
df = df.fillna({"A":A_median, "B":B_median, "C":C_median, "D":D_median})
"""
A B C D
0 1 23.0 45.0 33.0
1 12 34.0 67.5 28.0
2 32 28.5 90.0 30.5
"""