这是一篇实战项目中pandas的使用小记,初次整个项目使用pandas超90%,作为记录留存
注意:仅作为个人理解和实战,没有深入研究各个函数深层使用方法
读取Excel
场景:读取含多个sheet页的Excel文件,同时将Excel内容统一为object
import pandas as pd
# file 是文件路径
# dtype 是统一读出来的数据为指定类型
df = pd.read_excel(file, sheet_name=None, dtype=object)
场景:读取Excel时,不对内容进行统一使用场景
# 非dtype=object 或者 str 会直接显示e+X 这样形式
df = pd.read_excel(file, sheet_name=None)
场景:读取含单个sheet页的Excel文件,同时将Excel内容统一为object
# fillna('') 对于NaN直接使用空字符串代替
df = pd.read_excel(file, dtype=object).fillna('')
操作Excel
场景:按照索引对行进行原对象上的删除操作
# 表示行 axis=0、表示列 axis=1
# 删除一个索引行
df.drop(index=[0], axis=0, inplace=True)
# 删除多个索引行
df.drop(index=[0,1, 3,4], axis=0, inplace=True)
场景:按照列名对列进行删除操作
# test, test1, test2 为列名
# 单列删除
df = df.drop("test", axis=1)
# 多列删除
df = df.drop(["test","test1","test2"], axis=1)
场景:增加列
# 增加一列
df["test"] = "哈哈哈哈!!!"
# 合并多列为一列。合并test1 和 test2 使用\n 作为连接方式 赋给test列
df[test] = new_df[['test1', 'test2']].apply(lambda x: '\n'.join(x), axis=1)
# 增加多列
df[["test1","test2"]] = ["hahah","wwww"]
场景:对行,列做修改操作
# 在某一列内,所有的行都增加相同的字符串
df["test"] = df["test"].apply(lambda x: '增加的字符串内容'+x)
# 将某列内容设置为10个字符,将均是0000000000 替换为空
df["test"] = df["test"].astype(str).str.zfill(10)
df["test"] = df["test"].replace("0000000000","", regex=True)
场景:缺失值都置空
df.fillna('', inplace=True)
场景:不规则的时间统一时间格式
# df["test_时间"] 时间是 20240101
df["test_时间"] = pd.to_datetime(df["test_时间"])
# todo 输出结果
# 2024-01-01 00:00:00
场景:去掉含时分秒时间的 时分秒
# 统一时间格式
df["test_date"] = df["test_date"].dt.strftime("%Y-%m-%d")
场景:对涉及金额类型不统一,实现格式统一为浮点型
# 将金额统一为浮点型,没有就给0.00
df["test"] = df["test"].apply(lambda x: pd.to_numeric(x, errors='coerce', downcast='float')).fillna(0.00)
场景:保留小数位数
# 保留2位小数,将类型转为String
df["test"] = df["test"].map(lambda x: f'{x:.2f}').astype(str)
场景:将列中布尔类型替换为1,0
df['test'] = df['test'].map({False: 1, True: 0}).astype(str)
场景:删掉一些索引后,df 不会重新对索引进行排列,需要自己排
df = df.reset_index(drop=True)
场景:查询整个Excel内容
print(df.values.tolist()) # 查询全部内容
print(df.head().values.tolist()) # 查询前10条全部内容
print(df.columns.values.tolist()) # 查看 列名
场景:获取test列 内容长度为6 的索引
index6 = df.index[new_df["test"].str.len() == 6]
场景:将列内容分割组合为一个新的列
# df["test"] 的内容为 123456--->12:34:56
df["test1"] = df["test"].str[:2]+":"+df["test"].str[2:4]+":"+df["test"].str[4:]
场景:将含有分割符列进行分割,得到多列内容
df[["test1","test2"]] = df['test'].str.split('/', expand=True, n=1)
场景:将列内容根据需求做筛选,并赋值给新的一列
# 获取test列内容付款的索引,在发生额列依据索引进行查找赋值给 支出金额
zc_index = df.loc[df["test"] == "付款"].index.values
df["支出金额"] = df.loc[zc_index, "发生额"]