python基础 - Pandas

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'])
indexvalue
a3
b-5
c7
d4

(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'])
indexCountryCapitalPopulation
0BelgiumBrussels11190846
1IndiaNew Delhi1303171035
2BrazilBrasília207847528

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值