文章目录
pandas 基础
与 numpy 的区别
pandas 基于 numpy
两者侧重点不同
numpy | pandas |
---|---|
基础数据类型 | 扩展数据类型 |
数值计算 | 数据处理 |
数据结构与操作
pandas 的数据结构:
- Series (一维)
- DataFrame(二维)
数据结构的操作:
- 基本操作
- 运算操作
- 特征类操作
- 关联类操作
from pandas import pd
from pandas import Series, DateFrame
Series (一维)
Series:
- 一组数据+索引
- 带“标签”的数组
- 基本操作类似 ndarray、字典
创建 Series
Series(data, index, name)
"""
data:[]、{}、标量、ndarray
index:自定义索引
name:Series的名字
"""
import pandas as pd
# data:[]
li = [2,4,6,8]
ss = pd.Series(li)
print(ss)
ss= pd.Series(li, index=['a','b','c','d'])
print(ss)
# data:{}
# 索引:字典的 key
d = {'a':2,'b':4, 'c':6, 'd':8}
ss = pd.Series(d)
print(ss)
ss = pd.Series(d, index=['c','a',1,'g']) # index:匹配 索引,若没有'c',则返回NaN
print(ss)
# c 6.0
# a 2.0
# 1 NaN
# g NaN
ss = pd.Series(d, index=[0,1,2,3])
print(ss)
# 0 NaN
# 1 NaN
# 2 NaN
# 3 NaN
# data:标量
x = 100
ss = pd.Series(x)
print(ss) # 0 100
ss = pd.Series(x, index=['a','b','c','d'])
print(ss)
# data:ndarray
import numpy as np
arr = np.random.random(5)
ss = pd.Series(arr)
print(ss)
ss = pd.Series(arr, index=np.arange(5,0,-1))
print(ss)
基本操作
索引:自动索引(位置索引)、自定义索引(标签索引)
import pandas as pd
li = [2,4,6,8]
ss= pd.Series(li, index=['a','b','c','d'])
print(ss)
# 属性
print(ss.index)
print(type(ss.index))
print(ss.values)
print(type(ss.values)) # <class 'numpy.ndarray'>
ss.name = 'my_series_name'
ss.index.name = 'my_index_name'
print(ss)
# 索引
# 位置索引(自动索引)
print(ss[0], ss[-1])
print(ss[[1,3]])
# 标签索引(自定义索引)
print(ss['a'])
print(ss[['b','d']])
# 位置切片
print(ss[:2])
# 标签切片
print(ss[:'c']) # 包括'c'
# 条件过滤
print(ss[ss>5])
# 添加
ss['e'] = 10 # 类似字典
ss[4] = 10 # 自动索引
print(ss)
ss2 = pd.Series([10,12], index=['e','f']) # 标签可重复
ss = ss.append(ss2)
print(ss)
print(ss['e']) # 多个
# 删除
ss = ss.drop(2) # 自动索引(若没有自定义索引)
ss = ss.drop('b')
ss = ss.drop(['b','d']) # 多个
print(ss)
ss.pop(2) # 自动索引(若没有自定义索引)
ss.pop('b') # 不能删除多个
print(ss)
# 修改
ss[0] = 100 # 自动索引
ss['b'] = 100 # 自定义索引
print(ss)
ss[:2] = 100 # 都是100
ss[:'c'] = 100
ss[:2] = [100, 200] # 分别为100, 200
ss[['b', 'd']] = 100
print(ss)
DataFrame(多维)
DataFrame:
- 二维 或多维
- 各列的数据类型可不同,每一列都是一个Series
- 行索引 index
列索引 columns- 访问:
pandas.DataFrame[列][行]
,numpy.ndarray[行][列]
创建 DataFrame
DataFrame(data, index, columns)
"""
data:[]、{}、ndarray
index:自定义 行索引
columns:自定义 列索引
"""
import numpy as np
import pandas as pd
# data:[]
li = [2,4,6,8]
df = pd.DataFrame(li)
print(df)
df = pd.DataFrame(li, index=['a1','a2','a3','a4'])
print(df)
li = [[2,4,6], [8,10,12]]
df = pd.DataFrame(li, index=['a1','a2'], columns=['b1','b2','b3'])
print(df)
# data:{}
# 列索引:字典的key 行索引:自动索引
d = {'b1': [1,2], 'b2': [3,4], 'b3':[5]} # 缺失的用 NaN 填充
df = pd.DataFrame(d)
print(df)
df = pd.DataFrame(d, index=['a1','a2'], columns=['b1','b2','b3'])
"""
index:添加 自定义行索引
columns:匹配 列索引,若没有'b1',则返回NaN
"""
print(df)
df = pd.DataFrame(d, index=['a1','a2'], columns=['c1','c2','c3'])
print(df)
# data:ndarray
arr = np.random.randint(0,10,size=(2,3))
df = pd.DataFrame(arr, index=['a1','a2'], columns=['b1','b2','b3'])
print(df)
基本操作
属性、索引
import numpy as np
import pandas as pd
arr = np.random.randint(0,10,size=(2,3))
df = pd.DataFrame(arr, index=['a1','a2'], columns=['b1','b2','b3'])
print(df)
# 属性
print(df.index)
print(df.columns)
print(df.values)
print(df.dtypes) # 每列的元素类型
print(df.size) # 6
print(df.ndim) # 2
print(df.shape) # (2, 3)
# 索引
# 列:标签索引
print(df['b1']) # 单列
print(df[:'b3']) # 包括'b3'
print(df[['b1', 'b3']])
# 列:位置索引,没有columns
print(df[0])
print(df[:2])
# 行:标签索引
print(df.loc['a1'])
print(df.loc[:'a2']) # 包括'a2'
# 行:位置索引,无论有没有index
print(df.iloc[0])
print(df.iloc[:1]) # 不包括行1
# 多行多列
print(df.loc['a1', :'b2']) # 闭区间,loc(行标签,列标签)
print(df.iloc[1:, 0]) # 开区间,iloc(行位置,列位置),无论有无index、columns
print(df['b1'][0]) # 没有index
print(df[:][:1]) # 没有index
# 部分查看
print(df.head()) # 前5行
print(df.head(1)) # 前1行
print(df.tail())
print(df.tail(1))
# 条件过滤
d = {'b1':[1,2,3], 'b2':[4,5,6], 'b3':[7,8,9], 'b4':[10,11,12]}
df = pd.DataFrame(d, index=['a1','a2','a3'])
print(df)
print(df[df.b1==2])
print(df[(df.b1==2) & (df.b2==5)])
print(df[(df.b1==2) | (df.b1==3)])
print(df[df.b2>5])
print(df['b4'].str.contains('1')) # 某列字符串是否包含'1'
插入
import numpy as np
import pandas as pd
d = {'b1':[1,2,3], 'b2':[4,5,6], 'b3':[7,8,9], 'b4':[10,11,12]}
df = pd.DataFrame(d, index=['a1','a2','a3'])
print(df)
# 列
# 尾插
df['b5'] = df['b1']*df['b2']
df['b5'] = [13,14,15]
df['b5'] = pd.Series(np.random.randint(0,10,size=3), index=['a1','a2','a3'])
df['b5'] = 100
print(df)
# 任意插
df.insert(int, column, value)
"""
int:插入的位置
column: 列标签
value:固定值、[]、Series
"""
df.insert(1,'b5', 100)
df.insert(1,'b5', [13,14,15])
print(df)
# 行
# 尾插
d = {'b1':13, 'b2':14, 'b3':15, 'b4':16}
df = df.append(d, ignore_index=True)
print(df)
## 任意插
df.loc[1] = [13,14,15,16] # 插入位置:1
print(df)
删除
import numpy as np
import pandas as pd
d = {'b1':[1,2,3], 'b2':[4,5,6], 'b3':[7,8,9], 'b4':[10,11,12]}
df = pd.DataFrame(d, index=['a1','a2','a3'])
print(df)
# 列
df.drop(labels='b1', axis=1, inplace=True) # inplace=True:改变原数据
df.drop(labels=['b1','b2'], axis=1, inplace=True)
print(df)
# 行
df.drop(labels='a1', axis=0, inplace=True)
df.drop(labels=['a1','a3'], axis=0, inplace=True)
print(df)
修改
import numpy as np
import pandas as pd
d = {'b1':[1,2,3], 'b2':[4,5,6], 'b3':[7,8,9], 'b4':[10,11,12]}
df = pd.DataFrame(d, index=['a1','a2','a3'])
print(df)
# 一行
df.loc['a3'] = [13,14,15,16]
print(df)
# 一列
df.loc[:,'b1'] = [13,14,15]
print(df)
# 某些
df.loc[df.b1>1, 'b2'] = 100
print(df)
统计:汇总、计算
数值型数据
用 numpy 的统计函数
import numpy as np
import pandas as pd
d = {'b1':[1,2,3], 'b2':[4,5,6], 'b3':[7,8,9], 'b4':[10,11,12]}
df = pd.DataFrame(d, index=['a1','a2','a3'])
print(df)
# 用 numpy
print(np.sum(df['b1']))
# 用pandas
print(df['b1'].sum())
print(df.describe())
print(df[['b1','b3']].describe())
pandas的统计函数:
类别型数据
import numpy as np
import pandas as pd
d = {'id':[1,2,3,4],
'name':['Amy', 'Jack', 'Bob', 'Mike'],
'sex':['F','M','M','M'],
'age':[20, 18, 24, 19]
}
df = pd.DataFrame(d)
print(df)
# 频数
print(df['sex'].value_counts())
# 类型转换为 category
print(df['sex'].dtypes) # object
df['sex'] = df['sex'].astype('category')
print(df['sex'].dtypes) # category
# describe()
print(df['sex'].describe()) # 类别型数据的describe()需要先转换为category类型