什么是Pandas?
Pandas 是基于 NumPy 的一个开源 Python 库,它被广泛用于快速分析数据,以及数据清洗和准备等工作。它的名字来源是由“ Panel data”(面板数据,一个计量经济学名词)两个单词拼成的。简单地说,你可以把 Pandas 看作是 Python 版的 Excel。
常见的数据类型
1)Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。Series如今能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。
2)Time- Series:以时间为索引的Series。
3)DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。
4)Panel :三维的数组,可以理解为DataFrame的容器。
Panel 4D:四维…
Panel 5D: 五维
…
Panel nD: n维
安装Pandas
如果你已经安装了 Anaconda,你可以很方便地在终端或者命令提示符里输入命令安装 Pandas:
conda install pandas
如果你还没安装 Anaconda,你也可以用 Python 自带的包管理工具 pip 来安装:
pip install pandas
查看所安装Pandas的版本信息:
import pandas as pd
print(pd.__version__)
创建一个Series对象
import pandas as pd
import numpy as np
import string
from matplotlib import pyplot as plt
1)通过列表创建Series对象:(如果不指定索引, 默认从0开始)
array = ["粉条", "粉丝", "粉带"]
s1 = pd.Series(data=array)
print(s1)
2). 通过numpy的对象Ndarray创建Series:
n = np.random.randn(5) # 随机创建一个ndarray对象;
s2 = pd.Series(data=n)
print(s2)
n = np.random.randn(5) # 随机创建一个ndarray对象;
s2 = pd.Series(data=n)
# 修改元素的数据类型;
ss2 = s2.astype(np.int)
print(ss2)
3). 通过字典创建Series对象:
dict = {string.ascii_lowercase[i]:i for i in range(10)}
s3 = pd.Series(dict)
print(s3)
Series的基本操作
import pandas as pd
import numpy as np
import string
array = ["粉条", "粉丝", "粉带"]
s1 = pd.Series(data=array)
print(s1)
1). 修改Series索引
print(s1.index)
s1.index = ['A', 'B', 'C']
print(s1)
2). Series纵向拼接;
array = ["粉条", "粉丝", "粉带"]
如果不指定索引, 默认从0开始;
s2 = pd.Series(data=array)
s3 = s1.append(s2)
print(s3)
3). 删除指定索引对应的元素;
s1.index = ['A', 'B', 'C']
# array = ["粉条", "粉丝", "粉带"]
s2 = pd.Series(data=array)
s3 = s1.append(s2)
s3 = s3.drop('C') #bbbbbbbbbb 删除索引为‘C’对应的值;
print(s3)
4). 根据指定的索引查找元素
print(s3['B'])
s3['B'] = np.nan
print(s3)
5). 切片操作 — 同列表
print(s3[:2])
print(s3[::-1])
print(s3[-2:]) # 显示最后两个元素
Series运算
import pandas as pd
import numpy as np
import string
s1 = pd.Series(np.arange(5), index=list(string.ascii_lowercase[:5]))
s2 = pd.Series(np.arange(2, 8), index=list(string.ascii_lowercase[2:8]))
print(s1)
print(s2)
注意:
按照对应的索引进行计算, 如果索引不同,则填充为Nan。
1)加法
print(s1 + s2)
print(s1.add(s2))
2)减法
print(s1 - s2)
print(s1.sub(s2))
3)乘法
print(s1 * s2)
print(s1.mul(s2))
4)除法
print(s1 / s2)
print(s1.div(s2))
5)中位数
print(s1)
print(s1.median())
6)求和
print(s1.sum())
7)最大值
print(s1.max())
8)最小值
print(s1.min())
Series特殊的where方法
import pandas as pd
import numpy as np
import string
# &**********series中的where方法运行结果和numpy中完全不同;
s1 = pd.Series(np.arange(5), index=list(string.ascii_lowercase[:5]))
print(s1.where(s1 > 3))
# 对象中不大于3的元素赋值为10;
print(s1.where(s1 > 3, 10))
**# 对象中大于3的元素赋值为10;**
print(s1.mask(s1 > 3, 10))
创建DataFrame数据类型
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
方法1: 通过列表创建
li = [
[1, 2, 3, 4],
[2, 3, 4, 5]
]
# DataFRame对象里面包含两个索引, 行索引(0轴, axis=0), 列索引(1轴, axis=1)
d1 = pd.DataFrame(data=li, index=['A', 'B'], columns=['views', 'loves', 'comments', 'tranfers'])
# print(d1)
方法2: 通过numpy对象创建
narr = np.arange(8).reshape(2, 4)
# DataFRame对象里面包含两个索引, 行索引(0轴, axis=0), 列索引(1轴, axis=1)
d2 = pd.DataFrame(data=narr, index=['A', 'B'], columns=['views', 'loves', 'comments', 'tranfers'])
print(d2)
方法三: 通过字典的方式创建
dict = {
'views': [1, 2, ],
'loves': [2, 3, ],
'comments': [3, 4, ]
}
d3 = pd.DataFrame(data=dict, index=['粉条', "粉丝"])
print(d3)
日期操作的特例:
pd.date_range()
dates = pd.date_range(start='1/1/2018', end='1/08/2018')
print(dates)
行索引
dates = pd.date_range(start='today', periods=6)
数据
data_arr = np.random.randn(6, 4)
列索引
columns = ['A', 'B', 'C', 'D']
d4 = pd.DataFrame(data_arr, index=dates, columns=columns)
print(d4)
一维对象: 建立一个以2019年每一天作为索引, 值为随机数;
dates = pd.date_range(start='1/1/2019', end='12/31/2019', freq='D')
datas = np.random.randn(len(dates))
s1 = pd.Series(datas, index=dates)
print(s1[:3])
从文件中读取数据
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
1). csv文件的写入
df = pd.DataFrame(
{'province': ['陕西', '陕西', '四川', '四川', '陕西'],
'city': ['咸阳', '宝鸡', '成都', '成都', '宝鸡'],
'count1': [1, 2, 3, 4, 5],
'count2': [1, 2, 33, 4, 5]
}
)
df.to_csv('doc/csvFile.csv')
print("csv文件保存成功")
2). csv文件的读取
df2 = pd.read_csv('doc/csvFile.csv')
print(df2)
3). excel文件的写入
df2.to_excel("/tmp/excelFile.xlsx", sheet_name="省份统计")
print("excel文件保存成功")
分组与聚合之group_by
pandas提供了一个灵活高效的groupby功能,
1). 它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。
2). 根据一个或多个键(可以是函数、数组或DataFrame列>名)拆分pandas对象。
3). 计算分组摘要统计,如计数、平均值、标准差,或用户自定义函数。
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
df = pd.DataFrame(
{'province': ['陕西', '陕西', '四川', '四川', '陕西'],
'city': ['咸阳', '宝鸡', '成都', '成都', '宝鸡'],
'count1': [1, 2, 3, 4, 5],
'count2': [1, 2, 33, 4, 5]
}
)
1)根据某一列的key值进行统计分析;
grouped = df['count1'].groupby(df['province'])
print(grouped.describe())
print(grouped.median())
2)根据城市统计分析cpunt1的信息;
grouped = df['count1'].groupby(df['city'])
print(grouped.max())
3)指定多个key值进行分类聚合
grouped = df['count1'].groupby([df['province'], df['city']])
print(grouped)
print(grouped.max())
print(grouped.sum())
print(grouped.count())
4)通过unstack方法, 实现层次化的索引;
print(grouped.max().unstack())
字符串操作
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
series1= pd.Series(['$A:1', '$B:2', '$C:3', np.nan, '$cat:3'])
print(series1)
1)将所有的字母转换为小写字母, 除了缺失值
print(series1.str.lower())
2) 将所有的字母转换为大写字母, 除了缺失值
print(series1.str.upper())
3)分离
print(series1.str.split(":"))
4)去掉左右两端的某个字符
print(series1.str.strip('$'))