美文网首页
工具 | Pandas 100 题

工具 | Pandas 100 题

作者: biogeeker | 来源:发表于2020-05-16 18:22 被阅读0次
import pandas as pd

# 查看 Pandas 版本信息
print(pd.__version__) 

创建 Series 数据类型

  • 列表创建
li = [0,1,2,3]
s1 = pd.Series(li)
  • ndarray 创建
import numpy as np

nd = np.random.randn(4)
index = ['a','b','c','d']
s2 = pd.Series(nd, index=index)
  • 字典创建
dic = {'a':2,'b':3,'c':4,'d':5}
s3 = pd.Series(dic)

Series 基本操作

  • 修改 Series 索引
# ls 的索引更改为 A-D
s1.index = ['A','B','C','D']
  • Series 纵向拼接
# 把 s2 追加到 s1 下面
s1_2 = s1.append(s2)
  • 按指定索引删除元素
# 删除 s1 中索引A对应元素
s1.drop("A")
  • 修改指定索引元素
# 索引B对应元素改为100
s1['B'] = 100
  • 查找指定索引元素
s1['C']
  • Series 切片操作
# 前5个元素
s1_2[:5]

Series 运算

  • 四则运算
    加减乘除按照索引一一对应,索引不同则填充为 NaN
s2.add(s3) # +
s2.sub(s3) # -
s2.mul(s3) # *
s2.div(s3) # /
  • 统计运算
s1.median() # 中位数
s1.sum() # 求和
s1.max() # 最大值
s1.min() # 最小值
s1.mean() # 平均值 
s1.quantile() # 四分位数

创建 DataFrame 数据类型

  • Numpy 数组创建 DataFrame
# 定义当天时间作为索引
dates = pd.data_range('today', periods=8)
# 8行5列随机数组
num_arr = np.random.randn(8,5) 
# 定义列名
columns = ['A','B','C','D','F']
df1 = pd.DataFrame(num_arr, index=dates, columns=columns)
  • 字典创建 DataFrame
data = {'animal': ['cat', 'cat', 'snake', 'dog', 'dog', 'cat', 'snake', 'cat', 'dog', 'dog'],
        'age': [2.5, 3, 0.5, np.nan, 5, 2, 4.5, np.nan, 7, 3],
        'visits': [1, 3, 2, 3, 2, 3, 1, 1, 2, 1],
        'priority': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']}

labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
df2 = pd.DataFrame(data, index=labels)
df2

DataFrame 基本操作

df.dtypes # 每列的数据类型*
df.shape # 几行几列
df.head()
df.tail()
df.index
df.columns
df.idxmax()/idxmin() # 返回最大最小值的索引值

df.describe() # 查看统计数据*
df.describe(percentiles=[.05, .25, .75, .95]) # 自行选择分位数

df.info() # 打印二维数组信息*
df.T # 转置*

df.mean(axis=1) # 默认按列计算axis=0
# 排序*
# 按值排序
df.sort_values(by='age', ascending=True) # 默认升序 True
# 多值排序
df.sort_values(by=['animal', 'age'], ascending=[True, False]) # animal 升序,age降序
# 设置索引并按索引排序**
df.set_index('animal').sort_index(ascending=True) # 把 animal 列设为索引,并按照升序排序

# 切片 1,2,3 行
df[1:4]
# 位置查询 1,2,3 行
df.iloc[1:4] # index loc
# 根据列名查看单列
df['A']
# 查看多列 A,B,C
df[['A','B','C']]
# 拷贝副本
df_copy = df.copy()

# 判断 DataFrame 元素是否为空
df.isnull()
# 空值计数
df.isnull().sum()

# 列唯一值
df['A'].unique()
# 列唯一值个数
df['A'].nunique()

# 添加列数据
num = pd.Series(np.random.randint(1,10,10), index=df.index) # 值域1-10里找10个随机整数
# 添加以 'No.' 为列名的新数据列
df['No.'] = num  
# 也可以使用assign方法,但assign方法不会修改原DataFrame
df.assign(C=pd.Series(list('def'))) # 添加C列,索引为0,1,2; 元素值为d,e,f

# 根据类型选择列 select_dtypes(include=['']/exclude=[''])*
df.select_dtypes(include=['number']) # 选择数值型
df.select_dtypes(include=['float']) # 选择浮点数型
df.select_dtypes(exclude=['object']) # 选择非object型

# 根据 DataFrame 索引修改元素
# 索引序号从 0 开始,这里为 0, 0
# iat == index at
df.iat[0,0] = 168 # 第一个元素改为168
# 根据 DataFrame 的标签对元素进行修改*
df.loc['f', 'A'] = 168 # f行A列元素改为168
# 修改行或列名 - 索引 a 改为 one; 列名 animal 改为 new_col
df.rename(index={'a':'one'}, columns={'animal':'new_col'})

# iloc, loc, ix 小结
- df.iloc 主要是通过行号索引获取行数据 (index location)
- df.loc 主要通过行标签获取行数据 (location)
- df.ix 结合前两种的混合索引,既可以是行索引,也可以是行标签

# 对列求平均、中位数、和等
df['A'].mean()
df['A'].median()
df['A'].sum()

# 字符串转换大小写
string = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
string.str.lower() # 小写
string.str.upper() # 大写

# 缺失值操作
df.loc[~(df==0).all(axis=1), :]  # 过滤全部为0的行 (全部为0的行取非~)
df['A'].fillna(0)  # 填充数值0
df['A'].fillna(df['A'].median())  # 填充中位数
df.dropna(how="any") # 删除存在 NaN 的行
# count 返回A列非缺失值元素个数
df['A'].count()
# value_counts 返回A列每个元素有多少个,个数从大到小*
df['A'].value_counts()
# 返回占比多少
df['A'].value_counts(normalize=True)
# 其它缺失值填充方法 
- 拉格朗日插值法(就近填充);回归拟合;随机抽样填充;K近邻填充等

# DataFrame 按指定列对齐
left = pd.DataFrame({'key': ['foo1', 'foo2'], 'one': [1, 2]})
right = pd.DataFrame({'key': ['foo2', 'foo3'], 'two': [4, 5]})
# 按照 key 列对齐连接,只存在 foo2 相同,所以最后变成一行
pd.merge(left, right, on='key')
# 索引对齐特性*
df1 = pd.DataFrame({'A':[1,2,3]}, index=[1,2,3])
df2 = pd.DataFrame({'A':[1,2,3]}, index=[3,1,2])
df1-df2 # 按照索引运算,因此结果不是0,而应该是1-2, 2-3, 3-1

# 删除操作 drop, del, pop
# 设置 inplace=True 后会直接在原DataFrame中改动
df.drop(index='a', columns='new_col') # 删除 a 行和 new_col 列
df.drop(['A', 'B', 'C'], axis=1) # 删除A, B, C列
# del
del df['A', 'B', 'C']
# pop方法直接在原来的 DataFrame 上操作,且返回被删除的列,与python中的pop函数类似
df['A']=[1,2,3,4,5]
df.pop('A')

# idxmax 和 nlargest
# idxmax 函数返回最大值所在索引,在某些情况下特别适用(分类预测概率最大值),idxmin 功能类似
df['A'].idxmax() # A列最大值索引
# nlargest 函数返回前几大的元素值,nsmallest 功能类似
df['A'].nlargest(3) # A列前3大的元素值

# clip 和 replace 是两类替换函数
df['A'].clip(33, 80) # 截取A列范围 (33, 80),阈值之外的值替换为定义域边界值
# replace 是对某些值进行替换
df['animal'].replace(['snake','dog'], ['A','B']) # animal 列 snake, dog 替换为 A, B

# DataFrame 文件操作
df.to_csv()
pd.read_csv()
# 读取 excel 需要安装 xlrd 包*
df.to_excel('animal.xlsx', sheet_name='Sheet1')
pd.read_excel('animal.xlsx', 'Sheet1', index_col=None, na_values=['NA'])

参考

关于 pd.concat 的详解:pd.concat
推荐学习 Pandas 的优秀开源项目:Joyful-Pandas
Pandas 练习项目:Pandas 百题大冲关

--- End ---

相关文章

网友评论

      本文标题:工具 | Pandas 100 题

      本文链接:https://www.haomeiwen.com/subject/vrmtohtx.html