Python Pandas 简介

2018-01-04 python ai

Pandas 是一个基于 NumPy 的工具,主要是为了解决数据分析任务,包括了一些标准的数据模型,提供了高效地操作大型数据集所需的工具。

pandas logo

简介

安装

直接通过 pip install pandas 进行安装,一般使用如下方式引用 import pandas as pd

Series VS. DataFrame

这是 Pandas 中最基本的两种数据类型。

Series

类似于一维数组对象,其中的数据类型为 NumPy 的各种类型,而且每个元素都有各自的标签(或者是索引,可以是数字或者字符串)。

import pandas as pd

s1 = pd.Series([1, 2, '3', 4])  # 可以包含了多种类型,默认增加0~N的索引
print(s1)                       # 此时的类型为object(也就是字符串),如果全为数值则是int64
s1.index = ['a', 'b', 'c', 'd'] # 可以直接修改索引
s1.reindex(['a', 'b', 'c', 'd'], method='pad') # 或者使用reindex()修改索引

s1['a']                         # 查看单个
s1[['a', 'b']]                  # 查看多个,如果全是数值也可以通过s1[s1 > 2]过滤
s1['a':'c']                     # 通过切片查询
s1.drop('a')                    # 删除
s1['a'] = 100                   # 修改

s2 = pd.Series({'a':1,'b':2,'c':3}) # 也可以通过字典创建
s3 = pd.Series(range(4), index=['a', 'b', 'c', 'd']) # 通过range创建

在通过 reindex() 修改索引时,其中的参数可以选择 ffill 或者 pad 用来前向填充或者 bfill 或者 backfill 用来后向填充,默认填充 0 ,也可以通过 fill_value = 1 参数进行修改。

DataFrame

这是一个二维的数据结构,可以简单将其理解成一个 excel 中的表格,每一列都有一个标签 (也可以看做列名) 。

pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)

如果 data 为数组,那么其中的每个元素都将作为一行的数据。

import numpy as np
import pandas as pd

# 一个三行一列的数据表,列名为cols,行号为a b c
df1 = pd.DataFrame([1, 2, 3], columns=['cols'], index=['a', 'b', 'c'])
# 两行三列的数据
df2 = pd.DataFrame([[1, 2, 3], [4, 5, 6]], columns=['c1', 'c2', 'c3'], index=['a', 'b'])

df2.index                   # 查看行号(索引)以及列名称
df2.columns

df2[['c1', 'c3']]           # 直接访问返回的是列数据

df2.loc['a']                # 可以通过如下方法查看行数据
df2.loc[['a','b']]
df2.loc[df2.index[1:3]]

df2.sum()                   # 默认对每个列求和,也即是df2.sum(0)
df2.sum(1)                  # 对每个行求和

df2.apply(lambda x:x*2)     # 对每个元素乘2
df2**2                      # 类似于ndarray,也可以支持向量操作

df2.append(pd.DataFrame({'c1':7,'c2':8,'c3':9},index=['c']))  # 增加行

df2['c4'] = [10, 20]        # 新增列,此时会默认填充
df2['c5'] = pd.DataFrame([30, 40], index=['a','b']) # 如果不是默认的(0~N),则需要指定行名

# 其它方法,其中data可以是列表、数组、字典,列名和索引需要为列表对象
df3 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6]]), columns=['c1', 'c2', 'c3'], index=['a', 'b'])
df4 = pd.DataFrame({'c1':[1, 4], 'c2':[2, 5], 'c3':[3, 6]}, index=['a', 'b'])

注意,在使用 sum() 求和时,其中的参数只能是 0 或者 1 分别是对列或者行进行求和。

GroupBy

Pandas 提供了一个灵活高效的 groupby 功能,可以根据一个或者多个键拆分分组,然后可以对分布执行一些统计操作。

import numpy as np
import pandas as pd

df = pd.DataFrame({
	'A': ['a', 'b', 'a', 'c', 'a', 'c', 'b', 'c'],
	'B': [  2,   8,   1,   4,   3,   2,   5,   9],
	'C': [102,  98, 107, 104, 115,  87,  92, 123]
})
grouped = df.groupby('A')     # 会生成一个DataFrameGroupBy对象
print(grouped.groups)         # 具体分组信息,key为列A中的成员,value是数据的索引
# {'a': Int64Index([0, 2, 4]), 'b': Int64Index([1, 6]), 'c': Int64Index([3, 5, 7])}

print(grouped.mean())         # 对所有的成员计算平均值
#      B           C
# A                 
# a  2.0  108.000000
# b  6.5   95.000000
# c  5.0  104.666667
grouped[['B', 'C']].mean()    # 可以选择列,这里与上面等价
grouped.agg({'B':'mean', 'C':'sum'})  # 也可以不同列选择不同算法

在使用上述的聚合方式的时候,需要注意 size()count() 的区别,前者统计时包含 NaN 的值,后者不含 NaN