目录
这里续(中)
1、批量拆分和合并Excel文件
拆分:
def pandas_handle_excel():
work_dir = "./workMerge"
splits_dir = f"{work_dir}/splits"
#########################
# 拆分
import os
if not os.path.exists(splits_dir):
os.mkdir(splits_dir)
df_source = pd.read_excel(f'{work_dir}/titanic.xlsx')
print(df_source.head())
# 获取部分
total_row_count = df_source.shape[0] # 第1行的所有数据的数量
# 步骤一 计算分配数量
# 计算拆分后的每个excel的行数
# 这个大的excel,会拆分给这几个人
user_names = ['xiao_shuai', 'xiao_wang', 'xiao_ming', 'xiao_lei', 'xiao_bo', 'xiao_hong']
# 每个人的任务数目
splits_size = total_row_count // len(user_names)
if total_row_count % len(user_names) != 0:
splits_size += 1
print(splits_size)
# 步骤二
# 拆分成多个dataframe
df_subs = []
for idx, user_name in enumerate(user_names):
# iloc的开始索引
begin = idx * splits_size
# iloc的结束索引
end = begin + splits_size
# 实现df按照iloc拆分
df_sub = df_source.iloc[begin:end]
# 将每个子df存入列表
df_subs.append((idx, user_name, df_sub))
# 步骤三
# 将每个dataframe存入excel
for idx, user_name, df_sub in df_subs:
file_name = f"{splits_dir}/sub_{idx}_{user_name}.xlsx"
df_sub.to_excel(file_name, index=False)
合并:
#########################
# 合并
# 合并多个小的Excel到一个大的Excel里
# 步骤一 获取文件名
excel_names = []
for excel_name in os.listdir(splits_dir):
excel_names.append(excel_name)
# print(excel_names) # 将文件名数组生成
# 步骤二
# 分别读取到dataframe
df_list = []
for excel_name in excel_names:
# 读取每个excel到df
excel_path = f"{splits_dir}/{excel_name}"
df_split = pd.read_excel(excel_path)
# 得到user_name
user_name = excel_name.replace("sub_", "").replace(".xlsx", "")[2:]
print(excel_name, user_name)
# 给每个df添加1列,即用户名字
df_split["user_name"] = user_name
df_list.append(df_split)
# print(df_list)
# 步骤三
# 使用pd.concat进行合并
df_merged = pd.concat(df_list)
# print(df_merged.shape)
# print(df_merged.head())
# 每个取值出现的次数
print(df_merged['user_name'].value_counts())
# 步骤四
# 将合并后的dataframe输出到excel
df_merged.to_excel(f"{work_dir}/concatenate_data.xlsx", index=False)
2、pandas实现groupby分组统计
def pandas_groupBy():
import numpy as np
df = pd.DataFrame({
'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C': np.random.randn(8),
'D': np.random.randn(8)
})
# 分组使用聚合函数做数据统计
# 1、单个列groupby,查询所有数据列的统计
print(df.groupby('A').sum())
# 2、多个列groupby,查询所有数据列的统计
print(df.groupby(['A', 'B']).mean())
# 查看'A','B'变成二级索引
print(df.groupby(['A', 'B'], as_index=False).mean())
# 3、同时查看多种数据统计
print(df.groupby('A').agg([np.sum, np.mean, np.std]))
# 4、查看单列的结果数据统计
# 方法1:预过滤,性能更好
print(df.groupby('A')['C'].agg([np.sum, np.mean, np.std]))
# 方法2
print(df.groupby('A').agg([np.sum, np.mean, np.std])['C'])
# 5、不同列使用不同的聚合函数
print(df.groupby('A').agg({'C': np.sum, 'D': np.mean}))
# 遍历流程
# 1、遍历单个列聚合的分组
g = df.groupby('A')
for name, group in g:
print(name)
print(group)
print()
# 可获取单个分组的数据
g.get_group('bar')
# 2、遍历多个列聚合的分组
g = df.groupby(['A', 'B'])
for name, group in g:
print(name)
print(group)
print()
print(g.get_group(('foo', 'one'))) # 可以看到2个元素的tuple,代表不同的列
print(g['C'])#Series对象
#例:
#查看C的最大数值
data=df.groupby('A')['C'].max()
print(data)
更多见官方文档:API 参考手册 | Pandas 中文