1. 概述
本篇博文主要是 Python3 Pandas 的一些基础操作。
2. 具体实现
2.1 生成 DataFrame
"""
# 生成 DataFrame
"""
s = pd.Series([1, 2, 3, np.nan, 6]) # pd数据格式
print(s)
dates = pd.date_range('20230101', periods=6)
print(dates)
df = pd.DataFrame(np.random.rand(6, 4), index=dates, columns=['A', 'B', 'C', 'D']) # 生成矩阵形式的数据表, 带名称
print(df)
df1 = pd.DataFrame(np.arange(12).reshape((3, 4))) # DataFrame 默认名称
print(df1)
df2 = pd.DataFrame({
# 字典形式定义 DataFrame
'A':1,
'B':pd.Timestamp('20230101'),
'C':pd.Series(1, index=list(range(4)), dtype='float32'),
'D':np.array([3]*4, dtype='int32'),
'E':pd.Categorical(["test", "train", "test", "train"]),
'F':'foo',
})
print(df2) # 输出DataFrame数据
print(df2.dtypes) # 输出数据类型
print(df2.index) # 输出行名称 [0, 1, 2, 3]
print(df2.columns) # 输出列名称 ['A', 'B', 'C', 'D', 'E', 'F']
print(df2.values) # DataFrame 数值
print(df2.describe()) # 对 DataFrame 的描述, 包括均值, 标准差等
print(df2.T) # 转置
print(df2.sort_index(axis=1, ascending=False)) # index 排序
print(df2.sort_values('E')) # 值排序
2.2 数据选择
"""
## 数据选择
"""
dates = pd.date_range('20230101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D']) # 创建DataFrame
print(df) # 输出数据表
print(df['A']) # 输出名称为 A 的列
print(df.A) # 输出名称为 A 的列
print(df[0:3]) # 输出0, 1, 2 共3行
print(df['20230102':'20230104']) # 输出 2023-01-02 到 2023-01-04 行
## 按照标签选择: loc
print(df.loc['20230102']) # 选择 20230102 行
print(df.loc[:, ['A', 'B']]) # 选择所有行, 特定列输出['A', 'B']
print(df.loc['20230102', ['A', 'B', 'C']]) # 输出特定行, 特定列的数据
## 按照位置选择: iloc
print(df.iloc[0]) # 第 0 行的数据
print(df.iloc[0, 1]) # 输出第 0 行, 第 1 位的数据
print(df.iloc[0:2, 1:4]) # 第 0 and 1 行, 1,2,3 列
print(df.iloc[[1, 3, 5], 1:3]) # 非连续筛选对应元素
2.3 数据修改
"""
## 数据修改
"""
dates = pd.date_range('20230101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D']) # 创建DataFrame
print(df) # 输出数据表
df.iloc[0, 0] = 99 # 用位置修改值
print(df)
df.loc['20230101', 'B'] = 88 # 用索引修改值
print(df)
df.A[df.A > 4] = 0 #修改对应列, 对应条件的数值
print(df)
df.loc['20230101', ['B', 'C', 'D']] = 77 # 每行对应位置修改数值
print(df)
df['E'] = np.nan # 增加 DataFrame 中的一列
print(df)
df['F'] = pd.DataFrame(np.array([1, 2, 3, 4, 5, 6]), index=dates) # 按照 DataFrame 的格式增加新数据
print(df)
2.4 丢失数据处理(NaN)
"""
## 丢失数据处理(NaN)
"""
dates = pd.date_range('20230101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D']) # 创建DataFrame
print(df) # 输出数据表
df.iloc[0, 1] = np.nan
df.iloc[1, 2] = np.nan
print(df)
print(df.dropna(axis=0, how='any')) # 去掉包含 NaN 的行或者列 how = 'any''all'
print(df.fillna(value=99)) # 将 NaN 的位置填入对应的值
print(df.isnull()) # 检查 DataFrame 是否包含 NaN 数据
print(np.any(df.isnull())) # 检查 DataFrame 是否包含 NaN 数据, 存在 NaN, 返回 True
2.5 合并 DataFrame-concat
"""
## 合并DataFrame-concat
"""
df1 = pd.DataFrame(np.ones((3, 4))*0, columns=['A', 'B', 'C', 'D'])
print(df1)
df2 = pd.DataFrame(np.ones((3, 4))*1, columns=['A', 'B', 'C', 'D'])
print(df2)
df3 = pd.DataFrame(np.ones((3, 4))*2, columns=['A', 'B', 'C', 'D'])
print(df3)
res = pd.concat([df1, df2, df3], axis=0, ignore_index=True) # 竖向合并, ignore_index忽略索引, 重新编号
print(res)
df1 = pd.DataFrame(np.ones((3, 4))*4, columns=['A', 'B', 'C', 'D'], index=[1, 2, 3])
print(df1)
df2 = pd.DataFrame(np.ones((3, 4))*5, columns=['B', 'C', 'D', 'E'], index=[2, 3, 4])
print(df2)
res = pd.concat([df1, df2], join='outer', ignore_index=True) # 竖向直接合并, 全部保留, 缺失的数据用 NaN 填充
print(res)
res = pd.concat([df1, df2], join='inner', ignore_index=True) # 竖向直接合并, 只保留共同的部分
print(res)
res = pd.concat([df1, df2], axis=1) # 横向直接合并, 缺失部分的数据用 NaN 填充
print(res)
res = pd.concat([df1, df2], axis=1, join='inner') # 横向合并共同部分, 去掉其他部分
print(res)
2.6 合并 DataFrame-merge
"""
## 合并DataFrame-merge
"""
left = pd.DataFrame({
'key':['K0', 'K1', 'K2', 'K3'],
'A':['A0', 'A1', 'A2', 'A3'],
'B':['B0', 'B1', 'B2', 'B3'],
})
print(left)
right = pd.DataFrame({
'key':['K0', 'K1', 'K2', 'K3'],
'C':['C0', 'C1', 'C2', 'C3'],
'D':['D0', 'D1', 'D2', 'D3'],
})
print(right)
res = pd.merge(left, right, on='key') # 根据 'key' 合并
print(res)
res = pd.merge(left, right, left_index=True, right_index=True, how='outer') # 根据 Index 合并
print(res)
left = pd.DataFrame({
'key1':['K0', 'K0', 'K1', 'K2'],
'key2':['K0', 'K1', 'K0', 'K1'],
'A':['A0', 'A1', 'A2', 'A3'],
'B':['B0', 'B1', 'B2', 'B3'],
})
print(left)
right = pd.DataFrame({
'key1':['K0', 'K1', 'K1', 'K2'],
'key2':['K0', 'K0', 'K0', 'K0'],
'C':['C0', 'C1', 'C2', 'C3'],
'D':['D0', 'D1', 'D2', 'D3'],
})
print(right)
res = pd.merge(left, right, on=['key1', 'key2'], how='inner') # 合并共同的
print(res)
res = pd.merge(left, right, on=['key1', 'key2'], how='outer') # 全部合并
print(res)
res = pd.merge(left, right, on=['key1', 'key2'], how='outer', indicator='True') # indicator指示合并元素位置
print(res)
boys = pd.DataFrame({
'k':['K0', 'K1', 'K2', 'K3'],
'age':[11, 12, 13, 14],
})
girls = pd.DataFrame({
'k':['K0', 'K1', 'K2', 'K3'],
'age':[21, 22, 23, 24],
})
res = pd.merge(boys, girls, on='k', suffixes=['_boys', '_girls'], how='inner') # 通过suffixes参数区别不同种类
print(res)