0
点赞
收藏
分享

微信扫一扫

pandas入门

目录

1.导入pandas

2.pandas两个常用的工具数据结构——Series和DataFrame

2.1. Series

2.2. DataFrame

2.2.1 构建dataframe

2.2.2 DataFrame中的一列,可以按字典型标记或属性那样检索为Series;

2.2.3 将列表或数组赋值给一个列

2.2.4 删除一个列

 ​

2.2.5 返回DataFrame的values属性(以二维ndarray的形式返回)

2.2.6 索引对象

 2.2.7 Series或者DataFrame的索引

 2.2.8 使用loc和iloc选择数据

2.2.9 使用填充值的算数方法

2.2.10 DataFrame和Series间的操作

2.2.11 函数应用和映射 

 2.2.12 排序和排名

2.2.13 唯一值,计数和成员属性


pandas——进行数据清洗和分析(适合处理表格或异质型数据)

numpy——数值计算工具(适合处理同质型的数值类数组数据)

matplotlib——数据可视化工具

1.导入pandas

import pandas as pd

2.pandas两个常用的工具数据结构——Series和DataFrame

2.1. Series

Series:一种一维的数组型对象,它包含了一个值序列,并包含了数据标签,称为索引(index)。

不为数据指定索引默认生成的索引是从0-N-1(N是数据的长度)

另一个角度将series考虑成长度固定且有序的字典。所以可以用已存在的字典生成一个series

2.1.1创建series

obj = pd.Series(range(3,10,2))

# 输出:
0    3
1    5
2    7
3    9
dtype: int64

sdata = {'Alice':80,'Bob':88,'Sherry':93}
# 根据已有字典生成一个series
new_sdata = pd.Series(sdata)
# 输出:
Alice     80
Bob       88
Sherry    93
dtype: int64

2.1.2 取series的值values和索引index

obj.values
/* 输出:
    array([3, 5, 7, 9], dtype=int64)
*/
obj.index
/* 输出:
    RangeIndex(start=0, stop=4, step=1)
*/

2.1.3 生成series用修改index将新的series以修改后的index顺序排序

names = ['Bob','Sherry','Alice']
new_sdata_names = pd.Series(sdata,index=names)

# 输出:

Bob       88
Sherry    93
Alice     80
dtype: int64

表示缺失数据:“缺失”或“NA”

(pandas中)检查缺失数据:isnull和notnull函数

new_names = ['Bob','Sherry','Alice','Nobody']
new_sdata_names2 = pd.Series(sdata,index=new_names)

# 输出

Bob       88.0
Sherry    93.0
Alice     80.0
Nobody     NaN
dtype: float64
pd.isnull(new_sdata_names2) # 检查是空的为True

# 输出

Bob       False
Sherry    False
Alice     False
Nobody     True
dtype: bool
pd.notnull(new_sdata_names2) # 检查不是空的为True

# 输出

Bob        True
Sherry     True
Alice      True
Nobody    False
dtype: bool

2.2. DataFrame

dataframe表示的是矩阵的数据表,包含已排序的列集合,每一列可以是不同的值类型。可被视为一个共享相同索引的series的字典。

2.2.1 构建dataframe

最常用的方式:利用包含等长度列表或numpy数组的字典来形成dataframe

产生的dataframe会自动为series分配索引,并且列会按照排序的顺序排列。

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

# 输出

frame.head() # 只选出头部的五行

 

frame2 = pd.DataFrame(data,columns=['year','pop','state']) # DataFrame的列按照指定顺序排列

构建dataframe的第二种方式:包含字典的嵌套字典(将字典的键作为列,将内部字典的键作为行索引。)

pop = {'Nevada':{2001:2.4,2002:2.9},
       'Ohio':{2000:1.5,2001:1.7,2002:3.6}
      }
frame4 = pd.DataFrame(pop)

 构建dataframe的第三种方式:包含series的字典

pdata = {'Ohio':frame4['Ohio'][:-1],
          'Nevada':frame4['Nevada'][:2]
         }
frame5 = pd.DataFrame(pdata)

2.2.2 DataFrame中的一列,可以按字典型标记或属性那样检索为Series;

frame3 = pd.DataFrame(data,columns=['year','pop','state','222haha'])

 

frame3.222haha

 

只在列名是有效的python变量名时有效

frame3['222haha']

 

对于任意列名均有效 

2.2.3 将列表或数组赋值给一个列

值的长度必须和DataFrame的长度相匹配。

如果将series赋值给一列时,series的索引将会按照dataframe的索引重新排列,并在空缺的地方填充缺失值。

c = pd.Series([1,5,8],index=[0,5,3])
frame3['222haha']=c

如果被赋值的列并不存在,则会生成一个新的列

frame3['new_colum'] = frame3['state'] == 'Ohio'

 

2.2.4 删除一个列

del frame3['new_colum']

 

注意:从DataFrame中选取的列是数据的视图,而不是拷贝。因此,对Series的修改会映射到DataFrame中。如果需要复制,则应当显式地使用Series的copy方法。 

很多函数,如drop,会修改Series或者DataFrame的尺寸或者形状,这些方法直接操作原对象而不返回新对象。

 data = pd.DataFrame(np.arange(16).reshape(4,4),
                    index = ['Ohio','Colorado','Utah','New York'],
                    columns = ['one','two','three','four']
                    )

data.drop('Ohio')

 

但是,此时

 

要清除被删除的数据,需要加入inplace属性 

 只能执行一次,不然会报错,因为删掉后已经没这行(列)了。

2.2.5 返回DataFrame的values属性(以二维ndarray的形式返回)

frame4.values

 如果DataFrame的列是不同的dtypes,则values的dtype会自动选择适合所有列的类型

2.2.6 索引对象

索引对象是不可变的,用户是无法修改索引对象的。

重建索引——用reindex创建一个符合新索引的新对象。 

obj = pd.Series([4,5,6])

new_obj = obj.reindex(['a','b','c'])

 

new_obj = obj.reindex([2,'b',0])

 

注意:

1.调用reindex方法时,会将数据按照新的索引进行排列,如果某个索引值之前并不存在,则会引入缺失值。所以不是简单的按顺序把原series的index重新改变了。

2.索引对象是不可变的,用户是无法修改索引对象的,调用reindex方法也并没有修改原DataFrame,调用reindex方法后如果不返回赋值一个新的变量,那么在此基础上做些操作可能会出错。

ab = ['a','b','d']
f=frame.reindex(columns=ab)
f.loc[[1,2],ab]

 

 

 2.2.7 Series或者DataFrame的索引

 # 根据 index

# 根据 序号

普通的python切片是不包含尾部的,Series的切片与之不同 

使用这些方法可设值修改Series的相应部分 

 

# 单取一列 

# 取用列表排序想要的index 

# 用index序号来索引 

 # 用布尔值数组切片或选择数据

# 选择数据将其赋值

 

 

 2.2.8 使用loc和iloc选择数据

使用轴标签(loc)或整数标签(iloc)以Numpy风格的语法从DataFrame中选出数组的行和列的子集。

 除了单个标签或者标签列表外,索引功能也可以用于切片

 

ix索引依然存在,但不推荐,推荐使用严格的基于标签的索引的loc和基于整数的索引的iloc。 

注意:DataFrame的切片或者说索引(某数,不是某列)一定要用df.loc[]或df.iloc[],没有df[]这种写法(df[列名]可以取某列),series有s[]的写法取某数.

2.2.9 使用填充值的算数方法

为什么要酱紫?

想要实现类似于索引标签的自动外连接,没有交叠的标签位置上,内部数据对齐会产生缺失值。

 

可以看到哪怕df2的e列有数据,但是在df1+df2合并后形成的表是没有值的。 

也就是将这些df添加到一起会导致在一些不重叠的位置出现NA值。

即是说在进行四则运算的时候由于DataFrame之间可能存在行列索引不能对齐的情况,这样计算得到的结果会出现空值,所以我们需要对空值进行处理。

我们可以在进行计算的时候通过传入fill_value进行填充,另外直接使用运算符进行运算是没办法传递参数进行填充的饿,所以我们需要使用DateFrame中为我们提供的算数方法,add/sub/div等。

若在算除法的过程当中发生了除零,得到了一个inf,它表示无穷大。

 radd/rsub前面加个r是用来翻转参数的。

若我们希望得到DataFrame中所有元素的倒数,我们可以写成1/df,但1本身并不是一个DataFrame,所以我们不能用1来呼叫DataFrame中的方法,也就不能传递参数,为了解决这种情况,我们可以把1/df写成df.rdiv(1)

2.2.10 DataFrame和Series间的操作

广播机制:当我们从arr中减去arr[0]时,减法在每一行都进行了操作

 

 DataFrame 和Series间的算术操作和Numpy中不同维度数组间的操作类似。

 默认DataFrame和Series的数学操作中会将Series的索引和DataFrame的列进行匹配,并广播到各行。如果一个索引值不在DataFrame的列中,也不在Series的索引中,则对象会重建索引并形成联合。

如果想改成在列上广播,在行上进行匹配,必须使用算术方法中的一种。

 

2.2.11 函数应用和映射 

 Numpy的通用函数(逐元素数组方法)对pandas对象也有效。

# 生成数值符合正太分布的4行3列的数组
frame = pd.DataFrame(np.random.randn(4,3),columns=list('bde'),index=['Utah','Ohio','Texas','Oregon'])

 

 DataFrame的apply方法可将函数应用到一行或一列的一维数组上。

 注意:默认是从axis=0,也就是列

传递给apply的函数不一定要返回一个标量值,也可以返回带有多个值的Series

def f(x):
    return pd.Series([x.min(),x.max()],index = ['min','max'])
frame.apply(f)

逐元素调用函数的时候用applymap方法。

假如想要根据frame中的每个浮点数计算一个格式化字符串,可以使用applymap方法。

如果用apply,则报错 

 使用applymap作为函数名是因为Series有map方法,可以将一个逐元素的函数应用到Series上。

 2.2.12 排序和排名

 sort_index()方法:按行或按列索引进行字典型排序,该方法返回一个新的,排序好的对象。

 

 数据默认会升序排序,但是也可以按照降序排序

也可用sort_values()方法根据Series的值进行排序,默认情况下,所有的缺失值会被排序到Series的尾部。 

 使用多列作为排序键,即传递多个列名给sort_values的可选参数by

 Series和DataFrame的rank()方法:实现排名,当有平级情况时,取它们的平均排名

例如4排第4和第5,则它们的平均等级为(4+5)/2=4.5 

但这种就有可能出现小数,

当出现同样的数字的时候,我们按先看到谁谁就是老大的原则,也就是排名根据他们在数据中的观察顺序进行分配。rank(method = "first")

 ascending=False #降序排列

method="max" #将排名最大的赋值给值

 DataFrame可以对行或列计算排名

 skipna=True #有缺失值也会计算结果

默认为True

 idxmax() 或者idxmin() 返回的是间接统计信息。

 

除归约方法外,有的方法是积累型方法:

 

如cumsum() 

2.2.13 唯一值,计数和成员属性

一维Series包含的数值可能是重复的,unique()方法会给出Series中的唯一值。

 value_counts()方法计算Series包含的值的个数,返回的Series会按照数量降序排列。可设置sort=False不排序返回 

isin()方法执行向量化的成员属性检查

 还可以将数据集以Series或者DataFrame一列的形式过滤为数据集的值子集。

 与isin相关的Index.get_indexer()方法,可以提供一个索引数组,这个索引数组可以将可能非唯一值数组转换为另一个唯一值数组:

 当我们想要计算DataFrame多个相关列的直方图,可以将函数传入DataFrame的apply函数可得到。

例如将pandas.value_counts传入可得到所有列中出现的值它们分别在每列中出现的次数。

结果中的行标签是所有列中出现的不同值,数值是这些值在每个列中出现的次数 

举报

相关推荐

0 条评论