pandas是基于numpy构建的。
目的是使以numpy为中心的应用变得更加简单。
import pandas as pd
from pandas import Series, DataFrame
一、Series类型
1、这个类型类似于一维数组对象。它是由一组数据及一组与之相关的数据标签(索引)组成的。
obj = Series([1, 2, 3, 4, 5, 6])
print(obj)
print(obj.values)
print(obj.index)
obj[5]
2、自定义索引
obj = Series(['a', 'b', 'c', 'd', 'e'], index=[1, 2, 3, 4, 5])
print(obj)
obj[5]
3、类似于字典, 可通过字典转换
data = {'a': 10000, 'b': 20000, 'c':30000}
obj = Series(data)
obj
# 根据index索引转换
keys = ['a', 'c']
obj_1 = Series(data, index=keys)
print(obj_1)
4、缺失数据处理
data = {'a': 10000, 'b': 20000, 'c':30000}
obj = Series(data)
# 判断是否有数据缺失
pd.isnull(obj)
# 判断是否有数据缺失
pd.notnull(obj)
data = {'jack':None, 'tony':55, 'robbin': 50, 'yiming':None}
obj = Series(data)
obj
# None null ''
obj.name = 'NameAndAge'
obj
obj.index.name = '姓名'
obj
二、DataFrame类型
- DataFrame 是一个表格型数据结构,它含有一组有序的列,每列可以是不同类型的值(数值、字符串、布尔值等都可以);
- DataFrame 本身有行索引,也有列索引;
- DataFrame 可以理解成是由Series组成的字典;
1、创建及基本筛选
DataFrame构造函数数据类型 -- 字典、numpy列表、Series类型、DataFrame类型
data = {
'秦': ['嬴政', '胡亥', '子婴', None],
'汉': ['刘邦', '刘彻', '刘询', '刘秀'],
'唐': ['李渊', '李世民', '李治', '武则天'],
'宋': ['赵匡胤', '赵匡义', '赵恒', '赵祯']
}
frame_data = DataFrame(data)
frame_data
frame_data['汉']
import numpy as np
dates = pd.date_range('20200506', periods=6)
dates
df = pd.DataFrame(np.random.rand(6, 4), index=dates, columns=list('ABCD'))
df
# 转置
df.T
# 筛选 左闭右闭
df['20200506':'20200508']
# loc起始下标为1
df.loc['20200506':'20200508']
df.loc['20200506':'20200508', :]
df.loc[:, ['A', 'B']]
df.loc['20200506':'20200508', ['A', 'B']]
df.loc['20200506', ['A', 'B']]
df.loc['20200506', 'A']
2、头部、尾部筛选
df.head(2)
df.tail(3)
三、Pandas的重新索引
obj = Series([3.5, 2.6, -2.3], index=list('abc'))
obj
obj_1 = obj.reindex(list('abcde'))
obj_1
obj_2 = obj.reindex(list('abcde'), fill_value=0)
obj_2
obj = Series([3.5, 2.6, -2.3], index=[0,2,4])
obj
# 向前填充
obj.reindex(range(6), method='ffill')
# 向后填充
obj.reindex(range(6), method='bfill')
四、算数运算和数据对齐
- 加法:add
- 减法:sub
- 乘法:mul
- 除法:div
- 取余:mod
d1 = Series([1.3, 1.5, 2.6, -3.5], index=list('abcd'))
d1
d2 = Series([-1.3, -1.5, -2.6, 3.9, 9.8], index=list('abcde'))
d2
# 加法
d1 + d2
df1 = DataFrame(np.arange(9).reshape((3, 3)), columns=list('abc'), index=list('123'))
df1
df2 = DataFrame(np.arange(12).reshape((4, 3)), columns=list('cde'), index=list('1234'))
df2
# 在行和列上都发生操作,没有重叠的部分都为空
df1 + df2
# 相加时,其中一个为空时默认以‘fill_value’相加
# 两者都为空时,结果为空
df1.add(df2, fill_value=0)
五、DataFrame 和 Series 之间的运算
frame = DataFrame(np.arange(12).reshape((4, 3)), columns=list('bde'), index=[1, 2, 3, 4])
frame
series = frame.loc[1]
series
# 广播相减
frame - series
# 广播相加
frame + series
series_1 = Series(range(3), index=list('bef'))
series_1
# 只有重叠列进行操作,其余为空
frame + series_1
六、排序
1、Series
obj = Series(range(4), index=['d', 'e', 'a', 'b'])
obj
obj.sort_index()
obj.sort_values()
2、DataFrame
frame = DataFrame(np.arange(8).reshape(2,4), index=['two', 'one'], columns=['c', 'd', 'a', 'b'])
frame
frame.sort_index()
frame.sort_index(axis=1)
frame = DataFrame({'b': [4, 7, 1, -1], 'a': [0, 4, 2, 0]})
frame
frame.sort_values(by='b')
七、层次化索引
它能够让你在一个轴上拥有多个索引级别,另外一种说法是它能够使你可以以低纬度形式处理高纬度数据(降维)
1、Series
data = Series(np.random.randn(10), index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd', 'd'],[1, 2, 3, 1, 2, 3, 1, 2, 3, 3]])
data
data.index
data['b']
data['b':'c']
data[:,2]
data['b', 1]
2、DataFrame
frame_data = DataFrame(np.arange(12).reshape(4,3),
index=[['a', 'a', 'b', 'b'], [1,2,1,2]],
columns=[['Black', 'Yellow', 'Blue'], ['Green', 'Red', 'Green']])
frame_data
frame_data.index.names = ['key1', 'key2']
frame_data
frame_data.columns.names = ['color1', 'color2']
frame_data
frame_data.index
frame_data['Black']
frame_data.loc['a']
frame_data.loc['a', ['Black']]
frame_data.sum(level='key2')
frame_data.sum(level='color2', axis=1)
八、pandas文本格式数据处理
查看数据:cat data1.csv
# 读文件
pd.read_csv('data1.csv')
pd.read_table('data1.csv', sep=',')
pd.read_csv('data1.csv', header=None)
pd.read_csv('data1.csv',index_col='追问')
pd.read_csv('data1.csv', index_col=['追问','问题'])
pd.read_csv('data2.csv', skiprows=[2]) # 行号是从1开始的
pd.read_csv('data1.csv', nrows=5)
chunker = pd.read_csv('data1.csv', chunksize=10)
chunker
sd = Series([])
for c in chunker:
sd = sd.add(c['问题'].value_counts(), fill_value=0)
sd
# 写文件
data = pd.read_csv('data1.csv', nrows=5)
data.to_csv('test1.data', sep='|')
# excel
pd.read_excel('data3.xlsx')
# 图表显示
excel = pd.read_excel('data3.xlsx', sheet_name='Sheet2')
pl = excel.plot(kind='scatter', x='age', y='p').get_figure()
pl.savefig('1.jpg')
# 图表显示
dates = pd.date_range('20200501', periods=6)
df = DataFrame(np.random.rand(6,4), index=dates, columns=list('abcd'))
df
pl = df.plot(kind='scatter', x='a', y='b').get_figure()
pl.savefig('2.jpg')