Pandas 是基于 Numpy 创建的 Python 库,为 Python 提供了易于使用的数据结构和数据分析工具。
使用以下语句导入 Pandas 库:
import pandas as pd
1、Pandas 数据结构
(1)Series - 序列
存储任意类型数据的一维数组:
s = pd.Series([3, -5, 7, 4], index=['a', 'b', 'c', 'd'])
index | value |
a | 3 |
b | -5 |
c | 7 |
d | 4 |
(2)DataFrame - 数据框
存储不同类型数据的二维数组
data = {'Country': ['Belgium', 'India', 'Brazil'],
'Capital': ['Brussels', 'New Delhi', 'Brasília'],
'Population': [11190846, 1303171035, 207847528]}
df = pd.DataFrame(data, columns=['Country', 'Capital', 'Population'])
index | Country | Capital | Population |
0 | Belgium | Brussels | 11190846 |
1 | India | New Delhi | 1303171035 |
2 | Brazil | Brasília | 207847528 |
2、输入/输出
详细参考:https://blog.csdn.net/qq_19446965/article/details/106882889
(1)读取/写入CSV
pd.read_csv('test.csv', header=0, nrows=3)
df.to_csv('test.csv')
(2)读取/写入Excel
pd.read_excel('test.xlsx')
pd.to_excel('test.xlsx', sheet_name='Sheet1')
# 读取内含多个表的Excel
xlsx = pd.ExcelFile('test.xls')
df = pd.read_excel(xlsx, 'Sheet1')
(3)读取和写入 SQL 查询及数据库表
from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:')
pd.read_sql("SELECT * FROM my_table;", engine)
pd.read_sql_table('my_table', engine)
pd.read_sql_query("SELECT * FROM my_table;", engine)
read_sql()是 read_sql_table() 与 read_sql_query()的便捷打包器
pd.to_sql('myDf', engine)
3、选取、布尔索引及设置
s['b'] # 取序列的值 -5
df[1:] # 取数据框的子集
# Country Capital Population
# 1 India New Delhi 1303171035
# 2 Brazil Brasília 207847528
区域选取:
区域选取可以从多个维度(行和列)对数据进行筛选,可以通过df.loc[],df.iloc[],df.ix[]三种方法实现。采用df.loc[],df.iloc[],df.ix[]这三种方法进行数据选取时,方括号内必须有两个参数,第一个参数是对行的筛选条件,第二个参数是对列的筛选条件,两个参数用逗号隔开。df.loc[],df.iloc[],df.ix[]的区别如下:
- df.loc[]只能使用标签索引,不能使用整数索引,通过便签索引切边进行筛选时,前闭后闭。
- df.iloc[]只能使用整数索引,不能使用标签索引,通过整数索引切边进行筛选时,前闭后开。
- df.ix[]既可以使用标签索引,也可以使用整数索引。
单元格选取:
单元格选取包括df.at[]和df.iat[]两种方法。df.at[]和df.iat[]使用时必须输入两个参数,即行索引和列索引,其中df.at[]只能使用标签索引,df.iat[]只能使用整数索引。df.at[]和df.iat[]选取的都是单个单元格(单行单列),所以返回值都为基本数据类型。
(1)按位置
df.iloc[[0], [0]] # 按行与列的位置选择某值:
# Country
# 0 Belgium
df.iat[0, 0] # 'Belgium'
(2)按标签
df.loc[[0], ['Country']]
# Country
# 0 Belgium
df.at[0, 'Country'] # 'Belgium'
(3)按标签/位置
df.ix[2]
# Country Brazil
# Capital Brasília
# Population 207847528
df.ix[:, 'Capital']
# 0 Brussels
# 1 New Delhi
# 2 Brasília
df.ix[1, 'Capital'] # 'New Delhi'
(4)布尔索引
s[~(s > 1)] # 序列 S 中没有大于1的值
# b -5
s[(s < -1) | (s > 2)] # 序列 S 中小于-1或大于2的值
# a 3
# b -5
# c 7
# d 4
df[df['Population'] > 1200000000] # 使用筛选器调整数据框
# Country Capital Population
# 1 India New Delhi 1303171035
4、删除数据
s.drop(['a', 'c']) # 按索引删除序列的值 (axis=0)
df.drop('Country', axis=1) # 按列名删除数据框的列(axis=1)
5、排序和排名
df.sort_index() # 按索引排序
df.sort_values(by='Country') # 按某列的值排序
df.rank() # 数据框排名
# Country Capital Population
# 0 1.0 2.0 1.0
# 1 3.0 3.0 3.0
# 2 2.0 1.0 2.0
6、查询序列与数据框的信息
(1)基本信息
df.shape # (行,列))
# (3, 3)
df.index # 获取索引
# RangeIndex(start=0, stop=3, step=1)
df.columns # 获取列名
# Index(['Country', 'Capital', 'Population'], dtype='object')
df.info() # 获取数据框基本信息
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 3 entries, 0 to 2
# Data columns (total 3 columns):
# Country 3 non-null object
# Capital 3 non-null object
# Population 3 non-null int64
df.count() # 非Na值的数量
# Country 3
# Capital 3
# Population 3
(2)统计信息
df.sum() # 求和
df.cumsum() # 累加
df.min() # 最小值
# Country Belgium
# Capital Brasília
# Population 11190846
df.max() # 最大值
# Country India
# Capital New Delhi
# Population 1303171035
df['Population'].idxmin() # 最小值索引: 0
df['Population'].idxmax() # 最大值索引: 1
df.mean() # 平均值
df.median() # 中位数
df.describe() # 基础统计数据
# Population
# count 3.000000e+00
# mean 5.074031e+08
# std 6.961346e+08
# min 1.119085e+07
# 25% 1.095192e+08
# 50% 2.078475e+08
# 75% 7.555093e+08
# max 1.303171e+09
7、应用函数
df.apply(lambda x: x*2) # 应用函数
df.applymap(lambda x: x*2) # 对每个单元格应用函数
# Country Capital Population
# 0 BelgiumBelgium BrusselsBrussels 22381692
# 1 IndiaIndia New DelhiNew Delhi 2606342070
# 2 BrazilBrazil BrasíliaBrasília 415695056
8、数据对齐
如有不一致的索引,则使用NA值:
s3 = pd.Series([7, -2, 3], index=['a', 'c', 'd'])
s + s3
# a 10.0
# b NaN
# c 5.0
# d 7.0
还可以使用 Fill 方法进行内部对齐运算:
s.add(s3, fill_value=0)
# a 10.0
# b -5.0
# c 5.0
# d 7.0
s.sub(s3, fill_value=2)
s.div(s3, fill_value=4)
s.mul(s3, fill_value=3)
过滤时间范围:
import io
import requests
from datetime import datetime
import pandas
ticker = 'SPY'
start_date = '2009-12-31'
end_date = '2016-12-08'
s_dt = datetime.strptime(start_date, '%Y-%m-%d')
e_dt = datetime.strptime(end_date, '%Y-%m-%d')
url = 'http://chart.finance.yahoo.com/table.csv?s={0}&a={1}&b={2}&c={3}&d={4}&e={5}&f={6}&g=d&ignore=.csv'
url = url.format(ticker, s_dt.month-1, s_dt.day, s_dt.year, e_dt.month-1, e_dt.day, e_dt.year)
data = requests.get(url).content
df = pandas.read_csv(io.StringIO(data.decode('utf-8')))
df.drop('Open', 1, inplace=True)
df.drop('High', 1, inplace=True)
df.drop('Low', 1, inplace=True)
df.drop('Volume', 1, inplace=True)
df.drop('Close', 1, inplace=True)
df.columns = ['date', ticker]
df['date'] = pandas.to_datetime(df['date'], format='%Y-%m-%d')
df = df.set_index('date')
df = df.ix[pandas.date_range(start=start_date, end=end_date, freq='BM')]
摘自DataCamp
Learn Python for Data Science Interactively