UP | HOME

Pandas 数据处理包

Table of Contents

1 Pandas 简介

Pandas 一个是 BSD 许可证下开源的 Python 包,它提供非常方便使用的数据结构和数据 分析工具。注意有以下几个优点:

  • 使用 Series 表示一维数据,DataFrame 表示二维数据
  • 支持对数据的多维度索引
  • 可以导入和导出 CSV,Excel 等其他格式的文件数据
  • 一些基本的统计功能(均值、方差、标准差等)

2 安装和简单使用

安装详细教程见 HERE。使用 pip 安装命令如下:

pip install pandas

2.1 读取 Excel 数据

pip install xlrd xlwt

将 Excel 文件读取成 DataFrame

import pandas as pd
import numpy as np

# 创建 Excel 文件对象
xl = pd.ExcelFile('a.xlsx')
# 查看 Excel 标签页
xl.sheet_names
# 读取第 1 个标签页,存成 DataFrame
df = xl.parse(xl.sheet_name[0])

# 输出 Excel 文件
pd.DataFrame(data).to_excel("b.xlsx", sheet_name="sheet01", index=False, header=True)

2.2 输入输出其它常用格式

使用 Pandas 的好处是可以一次性,快速,方便地度一些数据格式,同时也可以快速地 输出一些格式

# 读取 CSV 格式
df.to_csv('foo.csv')
pd.read_csv('foo.csv')
# HD5
df.to_hdf('foo.h5','df')
pd.read_hdf('foo.h5','df')
# Excel
df.to_excel('foo.xlsx', sheet_name='Sheet1')
pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])

3 快速入门和操作示例

3.1 创建对象

Pandas 自定义了一个 DataFrame 对象,DataFrame 和数据库的二维表很相似,包含列 名和和数据行,还支持 group 类似的操作。

s = pd.Series([1,3,5,np.nan,6,8])
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))

3.2 查看对象

一些常用的函数,可以大致地查看数据的特征

df.head()
df.tail(3)
df.index
df.columns
df.values
df.describe()
df.T # transpose
df.sort_index(axis=1, ascending=False)
df.sort_values(by='B')

3.3 部分选取

对感兴趣的数据选取处理,索引有效数据。DataFrame 默认方式是通过字符串作为列名 来索引列,通过数字下标索引行

# single column
df['A']
# using []: 数字索引行,字符串索引列
df[0:3]
df['20130102':'20130104']
# using label
df.loc[dates[0]]
df.loc[:,['A','B']]
df.loc['20130102':'20130104',['A','B']]
df.loc[dates[0],'A']
# using position
df.iloc[3]
df.iloc[3:5,0:2]
df.iloc[[1,2,4],[0,2]]

# using condition 使用条件
df[df.A > 0]
df[df > 0]

# assign
s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))
df['F'] = s1
df.loc[:,'D'] = np.array([5] * len(df))
df2 = df.copy()
# 带 where 条件赋值
df2[df2 > 0] = -df2

3.4 缺失数据

df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
df1.loc[dates[0]:dates[1],'E'] = 1
df1.dropna(how='any')
df1.fillna(value=5)
pd.isna(df1)

3.5 操作数据

对数据求平均值,每个元素进行单独操作

df.mean()
df.mean(1)
s = pd.Series([1,3,5,np.nan,6,8], index=dates).shift(2)
df.sub(s, axis='index')
df.apply(np.cumsum)
df.apply(lambda x: x.max() - x.min())
s = pd.Series(np.random.randint(0, 7, size=10))
s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
s.str.lower()

3.6 合并

df = pd.DataFrame(np.random.randn(10, 4))
pieces = [df[:3], df[3:7], df[7:]]
pd.concat(pieces)
# join
left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
pd.merge(left, right, on='key')
# append
df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
s = df.iloc[3]
df.append(s, ignore_index=True)

3.7 分组

df = pd.DataFrame({
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
    'C': np.random.randn(8),
    'D': np.random.randn(8)
})
print(df)
print(df.groupby('A').sum())
print(df.groupby(['A', 'B']).sum())
A      B         C         D
0  foo    one -1.699466  1.816580
1  bar    one -1.076721 -0.175009
2  foo    two  0.218883 -0.857612
3  bar  three  0.000211 -0.100240
4  foo    two  0.207557  0.332343
5  bar    two  0.218925  0.253677
6  foo    one  1.799058  0.784080
7  foo  three  1.727525  1.112355
            C         D
A
bar -0.857585 -0.021572
foo  2.253557  3.187746
                  C         D
A   B
bar one   -1.076721 -0.175009
    three  0.000211 -0.100240
    two    0.218925  0.253677
foo one    0.099592  2.600660
    three  1.727525  1.112355
    two    0.426440 -0.525269

3.8 分类

df = pd.DataFrame({
    "id": [1, 2, 3, 4, 5, 6],
    "raw_grade": ['a', 'b', 'b', 'a', 'a', 'e']
})
df["grade"] = df["raw_grade"].astype("category")
df["grade"].cat.categories = ["very good", "good", "very bad"]
df["grade"] = df["grade"].cat.set_categories(
    ["very bad", "bad", "medium", "good", "very good"])
df.sort_values(by="grade")
df.groupby("grade").size()

3.9 绘图

Pandas 调用 MatplotLib 画图,有时候也可以用一下

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
filename = '../static/image/2018/10/pandas1.png'

ts = pd.Series(np.random.randn(1000),
               index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()
ts.plot()

df = pd.DataFrame(np.random.randn(1000, 4),
                  index=ts.index,
                  columns=['A', 'B', 'C', 'D'])
df = df.cumsum()
plt.figure()
df.plot()
plt.legend(loc='best')

plt.savefig(filename)
return filename

4 参考链接

Last Updated 2020-02-27 Thu 19:23. Created by Jinghui Hu at 2018-10-12 Fri 11:04.