pandas使用

笔记来自b站:Numpy & Pandas (莫烦 Python 数据处理教程),总结如下:

pandas简介

pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。

pandas数据结构

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维命名容器的模块。

pandas常用操作

常用的操作有以下几类: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()

pandas使用_第1张图片

pandas使用_第2张图片

泰坦尼克号数据预处理

数据预处理一般过程

# 导入相关数据包
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)

你可能感兴趣的:(【python】)