Pandas是在numpy上加强的包,是高效实施数据框的包。DataFrame的本质是可以容纳不同数据类型的数组。并且还有数组名。
安装和导入
import pandas
import pandas as pd
从三个方面认识pandas
Series
DataFrame
Index
import numpy as np
import pandas as pd
series
Pandas的series对象是一个一维的有索引数组,可以通过列表创建。
>>> data = pd.Series([0.25, 0.5, 0.75, 1.0])
>>> data
0 0.25
1 0.50
2 0.75
3 1.00
dtype: float64
Series包含一个有顺序的值和一个有顺序的索引。
可以通过:data.index data.value 来访问。
可以看到,Series比numpy一维数组更加灵活。
创建:
#通过列表创建
data = pd.Series([0.25, 0.5, 0.75, 1.0],
index=['a', 'b', 'c', 'd'])
#通过字典来创建
population_dict = {'California': 38332521,
'Texas': 26448193,
'New York': 19651127,
'Florida': 19552860,
'Illinois': 12882135}
population = pd.Series(population_dict)
#广播数组创建
pd.Series(5, index=[100, 200, 300])
DataFrame
DataFrame 是多行Series构成的,具有行索引index,和 列名 columns。
可以通过 data.index 和 data.columns访问。
创建DataFrame对象
#通过简单的Series对象
states = pd.DataFrame({'serie1':serie1,'serie2':serie2})
#通过字典创建
data = [{'a':i,'b':2*i} for i in range(3)]
pd.DateFrame(data)
#通过一个二维numpy数组
A = np.zeros(3,dtype=[('A','i8'),('B','f8')])
A
pd.DataFrame(A)
pandas中的Index对象
pandas的对象最主要的区别就是有index,和colomns.
index 就如同一个数组。也可以直接访问
ind = pd.Index([2,3,5,7,11])
ind
ind[::2]
#索引之间的联合操作
indA = pd.Index([1, 3, 5, 7, 9])
indB = pd.Index([2, 3, 5, 7, 11])
indA & indB # intersection
indA | indB # union
indA ^ indB # symmetric difference
通用函数功能:
建立索引
series : 建立索引
rng = np.random.RandomState(42)
ser = pd.Series(rng.randint(0, 10, 4))
ser
pandas :建立索引
df = pd.DataFrame(rng.randint(0, 10, (3, 4)),
columns=['A', 'B', 'C', 'D'])
对数据帧和索引进行运算时需要对齐索引,对于未对齐的数据运算值为NAN。设立填充值。
fill = A.stack().mean()
A.add(B, fill_value=fill)
序列与数据框之间的操作
类似二维数组numpy,直接使用类似的操作运算或者访问。
A = rng.randint(10, size=(3, 4))
A
A - A[0]
df = pd.DataFrame(A, columns=list('QRST'))
df - df.iloc[0]
iloc[]表示隐示访问
缺失值处理
任何对缺失值nan的运算都是nan
可以使用忽略缺失值的聚合运算方法。
np.nansum(vals2)
np.nanmin(vals2)
np.nanmax(vals2)
请注意,除了将整型数组强制转换为浮点,pandas还自动将none转换为nan值
在pandas中,字符串数据使用object类型储存。
对空值的操作
删除、探索、填充
探究 isnull(): Generate a boolean mask indicating missing values
notnull(): Opposite of isnull()
删除 dropna(): Return a filtered version of the data
填充 fillna(): Return a copy of the data with missing values filled or imputed
分层索引
多索引序列
老实方法:
index = [('California', 2000), ('California', 2010),
('New York', 2000), ('New York', 2010),
('Texas', 2000), ('Texas', 2010)]
populations = [33871648, 37253956,
18976457, 19378102,
20851820, 25145561]
pop = pd.Series(populations, index=index)
pop
并不提倡使用该方法
更好的方法:使用pandas多层索引
index = pd.MultiIndex.from_tuples(index)#来源于元组
index
使用reindex()重赋索引
pop = pop.reindex(index)
pop
额外的索引
使用stack()
可以将多索引序列转化为常规序列。相反 unstack()
将常规序列转化为多索引序列。
创建多索引的方法
df = pd.DataFrame(np.random.rand(4, 2),
index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
columns=['data1', 'data2'])
df
使用字典
data = {('California', 2000): 33871648,
('California', 2010): 37253956,
('Texas', 2000): 20851820,
('Texas', 2010): 25145561,
('New York', 2000): 18976457,
('New York', 2010): 19378102}
pd.Series(data)
隐式的多层索引结构
pd.MultiIndex.from_arrays([['a', 'a', 'b', 'b'], [1, 2, 1, 2]])
pd.MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1), ('b', 2)])
pd.MultiIndex.from_product([['a', 'b'], [1, 2]])
多层索引命名
pop.index.names = ['state', 'year']
多层列名索引
columns = pd.MultiIndex.from_product([['Bob', 'Guido', 'Sue'], ['HR', 'Temp']],
names=['subject', 'type'])
health_data = pd.DataFrame(data, index=index, columns=columns)
多层索引的索引和切片
series:
pop['California', 2000]#第一层 第二层
pop['California']#索引式‘california’的数据
pop.loc['California':'New York']#同理 显式
多层索引重塑
data = data.sort_index()
pop.unstack(level=0)
pop_flat = pop.reset_index(name='population')
对多层索引使用聚合函数
data_mean = health_data.mean(level='year')
data_mean.mean(axis=1, level='type')
数据集的联合
concat()
在numpy中如何连接数据?
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
np.concatenate([x, y, z])
np.concatenate([x, y], axis=1)
在pandas中:
ser1 = pd.Series(['A', 'B', 'C'], index=[1, 2, 3])
ser2 = pd.Series(['D', 'E', 'F'], index=[4, 5, 6])
pd.concat([ser1, ser2])
补充:使用display可以显示数据框。
display('x', 'y', 'pd.concat([x, y], ignore_index=True)') #忽略索引
增加主键值:
display('x', 'y', "pd.concat([x, y], keys=['x', 'y'])")
内连接,外连接,左连接,右连接
display('df5', 'df6',
"pd.concat([df5, df6], join='inner')")
append()
display('df1', 'df2', 'df1.append(df2)')
在原数据框上追加一个数据框。
merge()
合并
具有相同项的合并
df3 = pd.merge(df1, df2)
更多请查看函数帮助
聚合分组函数
简单的聚合函数
sum()
mean()
groupBy:
流程:
split -> apply ->combine
df.groupby('key')
df.groupby('key').sum()