笔记来自b站:Numpy & Pandas (莫烦 Python 数据处理教程),总结如下:
pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。Series如今能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。
Time- Series:以时间为索引的Series。
DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。
Panel :三维的数组,可以理解为DataFrame的容器。
Panel4D:是像Panel一样的4维数据容器。
PanelND:拥有factory集合,可以创建像Panel4D一样N维命名容器的模块。
常用的操作有以下几类:1、初始化, 2、索引,3、设置值,4、导入导出数据,5、合并列表(连接),6、绘制数据(画图)
接下来我打算一一介绍上述操作,最后介绍一个数据预处理的实例。
1、初始化
以Series和DataFrame为例,DataFrame的初始化有三种方式,一种是用字典初始化,一种使用numpy数组初始化,首先看一下pandas API提供的构造函数:
pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
data : numpy ndarray (structured or homogeneous), dict, or DataFrame,Dict can contain Series, arrays, constants, or list-like objects
data为要装载的数组,可以是numpy数组、字典、或DataFrame
import pandas as pd
import numpy as np
#创建一个一维的Series
s = pd.Series([1,3,6,np.nan,4,1]) # similar with 1D numpy
print(s)
#创建一个日期序列
dates = pd.date_range('20160101', periods=6)
print(dates)
#创建一个DataFrame,data:6x4的numpy矩阵,取值为-1到1,行标签为datas,列标签为A、B、C、D
df = pd.DataFrame(data=np.random.randn(6,4),index=dates,columns=['A','B','C','D'])
#打印列标签为B的一列
print(df['B'])
用字典初始化DataFrame
#未指定行标签
df2 = pd.DataFrame(data={'A':['A1','A2','A3','A4'],'B':['B1','B2','B3','B4'],'C':['C1','C2','C3','C4']})
#指定行标签
df3 = pd.DataFrame(data={'A':['A1','A2','A3','A4'],'B':['B1','B2','B3','B4'],'C':['C1','C2','C3','C4']},index=['a','b','c','d'])
用DataFrame初始化
df4 = pd.DataFrame(df3)
查看属性
df4 = pd.DataFrame({'A' : 1.,
'B' : pd.Timestamp('20130102'),
'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
'D' : np.array([3] * 4,dtype='int32'),
'E' : pd.Categorical(["test","train","test","train"]),
'F' : 'foo'})
# 行标签
print(df4.index)
#列标签
print(df4.columns)
#取值
print(df4.values)
#转置
print(df4.T)
#形状
print(df4.shape)
#排序
df4 = pd.DataFrame(np.random.randn(4,4),index=['A','B','C','D'],columns=['k1','k2','k3','k4'])
print(df4.sort_index(axis=0, ascending=True)) #对索引按行降序排列,axis=1 按列
print(df4.sort_values(by='k2',axis=0)) #按第2列指标排序
print(df4.sort_values(by='B',axis=1)) #按第2行指标排序
2、索引
索引主要是用到两个函数iloc和loc,iloc使用索引取值,loc使用标签取值
dates = pd.date_range('20160101', periods=6)
df6 = pd.DataFrame(np.arange(24).reshape(6,4),index=dates,columns=['A','B','C','D'])
print(df6)
print(df6['A'], df6.A)
print(df6[0:3], df6['20160102':'20160104'])
# select by label: loc
print(df6.loc['20160102'])
print(df6.loc[:,['A','B']])
print(df6.loc['20160102', ['A','B']])
# select by position: iloc
print(df6.iloc[3])
print(df6.iloc[3, 1])
print(df6.iloc[3:5,0:2])
print(df6.iloc[[1,2,4],[0,2]])
3、设置值
修改值
dates = pd.date_range('20160101', periods=6)
df6 = pd.DataFrame(np.random.randn(6,4), index=dates, columns=['A', 'B', 'C', 'D'])
df6.iloc[2,2] = 1111
df6.loc['2013-01-03', 'D'] = 2222
df6.A[df6.A>0] = 0
#加上一个空行
df6['F'] = np.nan
df6['G'] = pd.Series([1,2,3,4,5,6], index=pd.date_range('20160101', periods=6))
print(df6)
缺失值处理
dates = pd.date_range('20130101', 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.dropna(axis=0, how='any')) # how={'any', 'all'}
print(df.fillna(value=0))
print(pd.isnull(df))
4、导入导出数据
read_table (filepath_or_buffer[, sep, ...]) |
Read general delimited file into DataFrame |
read_csv (filepath_or_buffer[, sep, ...]) |
Read CSV (comma-separated) file into DataFrame |
read_fwf (filepath_or_buffer[, colspecs, widths]) |
Read a table of fixed-width formatted lines into DataFrame |
read_msgpack (path_or_buf[, encoding, iterator]) |
Load msgpack pandas object from the specified |
# read from
data = pd.read_csv('student.csv')
data = pd.read_csv('student.csv',sep=',’) #sep分隔符可以是,\t,空格等
print(data)
# save to
data.to_pickle('student.pickle')
5、合并列表
df1 = pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'])
df3 = pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'])
#使用concat合并
print(pd.concat([df1,df2,df3],axis=0,ignore_index=True)) #按行合并
print(pd.concat([df1,df2,df3],axis=1,ignore_index=True)) #按列合并
#使用append合并
print(df1.append(df2))
#加上一行
s = pd.Series([1,2,3,4],index=['a','b','c','d'])
print(df1.append(s,ignore_index=True))
# join, ('inner', 'outer')
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'], index=[1,2,3])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['b','c','d', 'e'], index=[2,3,4])
res = pd.concat([df1, df2], axis=0, join='outer') #外连接,不去除重复的列
print(res)
res = pd.concat([df1, df2], axis=0, join='inner') #内连接,去除重复的列
print(res)
# join_axes
res = pd.concat([df1, df2], axis=1, join_axes=[df1.index])
#merge
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
print(left)
print(right)
res = pd.merge(left, right, on='key')
print(res)
6、绘制数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# plot data
# Series
data = pd.Series(np.random.randn(1000), index=np.arange(1000))
data = data.cumsum() #将所有数进行累加
##data.plot()
# DataFrame
data = pd.DataFrame(np.random.randn(1000, 4), index=np.arange(1000), columns=list("ABCD"))
data = data.cumsum()
# plot methods:
# 'bar', 'hist', 'box', 'kde', 'area', scatter', hexbin', 'pie'
ax = data.plot.scatter(x='A', y='B', color='DarkBlue', label="Class 1")
#在一个图里绘制另一个图
data.plot.scatter(x='A', y='C', color='LightGreen', label='Class 2', ax=ax)
plt.show()
泰坦尼克号数据预处理
数据预处理一般过程
# 导入相关数据包
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
root_path = '/opt/data/datasets/getting-started/titanic/input'
train = pd.read_csv('%s/%s' % (root_path, 'train.csv'))
test = pd.read_csv('%s/%s' % (root_path, 'test.csv'))
train.head(5)
train.info()
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId 891 non-null int64
Survived 891 non-null int64
Pclass 891 non-null int64
Name 891 non-null object
Sex 891 non-null object
Age 714 non-null float64
SibSp 891 non-null int64
Parch 891 non-null int64
Ticket 891 non-null object
Fare 891 non-null float64
Cabin 204 non-null object
Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB
# 存活人数
train['Survived'].value_counts()
0 549
1 342
Name: Survived, dtype: int64
# 对缺失值处理(Age 中位数不错)
titanic["Age"] = titanic["Age"].fillna(titanic["Age"].median())
titanic["Fare"] = titanic["Fare"].fillna(titanic["Fare"].median())
# 对文本特征进行处理(性别, 登船港口)
print(titanic["Sex"].unique())
titanic.loc[titanic["Sex"]=="male", "Sex"] = 0
titanic.loc[titanic["Sex"]=="female", "Sex"] = 1
# 组合特征(特征组合相关性变差了)
# titanic["FamilySize"] = titanic["SibSp"] + titanic["Parch"]
# S的概率最大,当然我们也可以按照概率随机算,都可以
print(titanic["Embarked"].unique())
"""
titanic[["Embarked"]].groupby("Embarked").agg({"Embarked": "count"})
Embarked
Embarked
C 168
Q 77
S 644
"""
titanic["Embarked"] = titanic["Embarked"].fillna('S')
titanic.loc[titanic["Embarked"] == "S", "Embarked"] = 0
titanic.loc[titanic["Embarked"] == "C", "Embarked"] = 1
titanic.loc[titanic["Embarked"] == "Q", "Embarked"] = 2
def get_title(name):
# 名字的尊称
title_search = re.search(' ([A-Za-z]+)\.', name)
if title_search:
return title_search.group(1)
return ""
titles = titanic["Name"].apply(get_title)
# print(pandas.value_counts(titles))
# 对尊称建立mapping字典
# 在数据的Name项中包含了对该乘客的称呼,如Mr、Miss等,这些信息包含了乘客的年龄、性别、也有可能包含社会地位,如Dr、Lady、Major、Master等称呼。这一项不方便用图表展示,但是在特征工程中,我们会将其提取出来,然后放到模型中。
# 剩余因素还有船票价格、船舱号和船票号,这三个因素都可能会影响乘客在船中的位置从而影响逃生顺序,但是因为这三个因素与生存之间看不出明显规律,所以在后期模型融合时,将这些因素交给模型来决定其重要性。
title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Dr": 5, "Rev": 6, "Major": 7, "Col": 7, "Mlle": 8, "Mme": 8, "Don": 9, "Dona": 9, "Lady": 10, "Countess": 10, "Jonkheer": 10, "Sir": 9, "Capt": 7, "Ms": 2}
for k, v in title_mapping.items():
titles[titles == k] = v
# print(pd.value_counts(titles))
# 添加一个新特征表示拥护尊称
titanic["Title"] = [int(i) for i in titles.values.tolist()]
# 添加一个新特征表示名字长度
titanic["NameLength"] = titanic["Name"].apply(lambda x: len(x))
# 相关性太差,删除
# titanic.drop(['PassengerId'], axis=1,inplace=True)
titanic.drop(['Cabin'], axis=1,inplace=True)
titanic.drop(['SibSp'], axis=1,inplace=True)
# titanic.drop(['Parch'],axis=1,inplace=True)
titanic.drop(['Ticket'], axis=1,inplace=True)
titanic.drop(['Name'], axis=1,inplace=True)