pandas使用笔记、数据清洗、json_normalize
文章目录构建数据构建数据-列向导构建数据-行向导构建数据-矩阵导向构建数据-记录导向构建数据-总结读取外部文件清洗数据示例清洗数据-1、创建原始数据2、使用 Pandas 进行数据清洗3、总结下这段代码干了什么读取数据常用方法pandas支持复杂结构的json吗?json_normalizejson_normalize直接拍扁json_normalize-结合record_path、metaPandas 是 Python 中用于数据分析和数据处理的“瑞士军刀”是目前数据科学领域最核心的工具库之一。必须掌握。构建数据构建数据主要通过DataFrame来实现。构建数据-列向导importpandasaspd data{姓名:[张三,李四,王五],年龄:[25,30,35],城市:[北京,上海,广州]}dfpd.DataFrame(data)print(df)输出结果姓名 年龄 城市0张三25北京1李四30上海2王五35广州这么理解就好理解了姓名是列名张三等是列下面的数据每一列的行数要相等。构建数据-行向导因为行数据本身没有列名所以构建时需要显示指定列名(columns)。importpandasaspd# 每一组中括号代表一行数据data[[张三,25,北京],[李四,30,上海],[王五,35,广州]]# 必须显式指定列名dfpd.DataFrame(data,columns[姓名,年龄,城市])print(df)输出结果姓名 年龄 城市0张三25北京1李四30上海2王五35广州构建数据-矩阵导向importpandasaspdimportnumpyasnp# 生成一个 3行4列 的随机数矩阵arrnp.random.randn(3,4)dfpd.DataFrame(arr,columns[A,B,C,D])print(df)输出结果A B C D00.3837210.299960-0.866526-1.8896211-0.418412-0.084870-1.0081830.0750372-0.1812211.113219-1.2967141.225547构建数据-记录导向importpandasaspd data[{姓名:张三,年龄:25,城市:北京},{姓名:李四,年龄:30,城市:上海},# 注意如果某一行缺少某个字段比如王五没写城市Pandas 会自动填 NaN{姓名:王五,年龄:35}]dfpd.DataFrame(data)print(df)输出结果姓名 年龄 城市0张三25北京1李四30上海2王五35NaN构建数据-总结一句话纯数据需要指定名其他都不需要指定列名。数据示例要纯数组姓名: [张三, 李四, 王五]需要指定列名列名数组[张三, 25, 北京]无需指定列名键值对{姓名: 张三, 年龄: 25, 城市: 北京}无需指定列名读取外部文件形式代码示例说明CSV 文件pd.read_csv(data.csv)最通用的文本格式Excel 文件pd.read_excel(data.xlsx)读取办公文档Parquet 文件pd.read_parquet(data.parquet)大数据/高性能场景首选SQL 数据库pd.read_sql(query, conn)从 MySQL/PostgreSQL 读取清洗数据示例清洗数据-1、创建原始数据新建sales_raw.xlsx文件内容复制进去订单ID门店名称销售日期销售额客户等级备注1001北京店2023-01-012500VIP无1002上海 分店2023-01-013000vip1003广州门店2023/01/021800Normal促销订单1004深圳店2023-01-022200NORMAL重要客户1001北京店2023-01-012500VIP无1005杭州分店2023-01-03High1006成都 门店2023-01-032800normal1007武汉店2023-01-043100新客户西安分店2023-01-042400VIP该数据是有脏数据的。1、重复数据订单ID为 1001 的记录重复出现。2、缺失值第7行“客户等级”为空第5行“销售额”为空第9行“订单ID”为空。3、格式不一致门店名称有“店”、“分店”、“门店”等多种写法且包含空格如“上海 分店”。客户等级VIP、vip、High、Normal、normal 大小写和命名不统一。销售日期存在 2023-01-01 和 2023/01/02 两种格式。4、异常空格“上海 分店”、“成都 门店”中存在多余空格。5、字段冗余“备注”列存在大量空值可能无实际用途。2、使用 Pandas 进行数据清洗代码importpandasaspd# 1. 读取原始数据dfpd.read_excel(sales_raw.xlsx)print(原始数据形状:,df.shape)print(前5行数据:)print(df.head())# 2. 处理缺失值# 填充销售额缺失值为该列均值数值型df[销售额]df[销售额].fillna(df[销售额].mean())# 填充客户等级缺失值为 Unknown分类变量df[客户等级]df[客户等级].fillna(Unknown)# 删除订单ID为空的整行关键字段缺失dfdf.dropna(subset[订单ID])# 3. 去除重复项基于订单IDdfdf.drop_duplicates(subset[订单ID],keepfirst)# 4. 标准化文本字段# 清洗门店名称去除空格、统一后缀为“店”df[门店名称]df[门店名称].str.replace( ,).str.replace(分店|门店,店,regexTrue)# 统一客户等级转为大写并映射为标准类别level_map{VIP:VIP,HIGH:High,NORMAL:Normal,UNKNOWN:Unknown}df[客户等级]df[客户等级].str.upper().map(level_map)# 5. 统一日期格式df[销售日期]pd.to_datetime(df[销售日期],errorscoerce)# 6. 删除冗余列如无用的备注dfdf.drop(columns[备注],errorsignore)# 7. 数据类型优化df[订单ID]df[订单ID].astype(int)df[销售额]df[销售额].round(2)# 8. 查看清洗后结果print(\n清洗后数据形状:,df.shape)print(清洗后数据:)print(df)# 9. 保存清洗后数据df.to_excel(sales_cleaned.xlsx,indexFalse)部分输出结果清洗后数据形状:(7,5)清洗后数据:订单ID 门店名称 销售日期 销售额 客户等级01001北京店2023-01-012500.0VIP11002上海店2023-01-013000.0VIP21003广州店2023-01-021800.0Normal31004深圳店2023-01-022200.0Normal51005杭州店2023-01-032537.5High61006成都店2023-01-032800.0Normal71007武汉店2023-01-043100.0Unknown注销售额 缺失值被填充为均值 2566.67客户等级 空值标记为 Unknown所有文本和日期均已标准化。3、总结下这段代码干了什么简单来说刚才那段代码主要干了 4 件“大扫除”的事情就像整理一个乱糟糟的房间一样️ 扔垃圾处理缺失值问题 表格里有些地方是空的。比如有的行没有“销售额”有的行没有“客户等级”。计算机没法计算空的东西。怎么修的填空缺 对于“销售额”我们算出其他所有订单的平均数把空缺填上或者填0。对于“客户等级”填上“未知”。删废行 如果一行数据连最重要的“订单ID”都没有那这行数据就彻底废了直接整行删除。对应代码 fillna (填充), dropna (删除)✂️ 剪重复去除重复项问题 “订单1001”在表里出现了两次内容一模一样。这可能是复制粘贴时手抖多粘了一次。如果不删掉算总销售额时就会算重。怎么修的告诉电脑“盯着‘订单ID’这一列看如果发现两个一样的ID只保留第一个把后面重复的统统删掉。”对应代码 drop_duplicates 立规矩标准化格式这是最繁琐的一步主要是为了统一“写法”。问题 A名字乱有的叫“上海 分店”带空格有的叫“广州门店”后缀不一样。怎么修先把所有空格删掉变成“上海分店”。再把所有的“分店”、“门店”全部替换成统一的“店”变成“上海店”。问题 B等级乱有的是大写“VIP”有的是小写“vip”还有“Normal”。怎么修全部强制转换成大写VIP, NORMAL。建立一个对照表把它们映射成统一的标准词。对应代码 .str.replace, .str.upper, .map️♂️ 抓内鬼修正数据类型问题 在Excel里“2023-01-01”有时候会被当成普通的文字字符串而不是真正的日期。这样你就没法算“这一天距离今天过了多久”。怎么修的强制把“销售日期”这一列刷上一层“时间滤镜”告诉电脑“别把它当文字这是时间”这样以后就能进行时间计算了。对应代码 pd.to_datetime读取数据常用方法类别文件格式读取函数写入函数文本/表格CSV / TSVpd.read_csv()df.to_csv()Excel (.xls, .xlsx)pd.read_excel()df.to_excel()JSONpd.read_json()df.to_json()HTML (网页表格)pd.read_html()df.to_html()高性能/二进制Parquetpd.read_parquet()df.to_parquet()HDF5pd.read_hdf()df.to_hdf()Pickle (Python专用)pd.read_pickle()df.to_pickle()Featherpd.read_feather()df.to_feather()其他/统计SQL 数据库pd.read_sql()df.to_sql()Stata / SAS / SPSSpd.read_stata()等df.to_stata()XMLpd.read_xml()df.to_xml()pandas支持复杂结构的json吗?最好是行列结构如果比较复杂需要结合其他手法如json_normalize()等。json_normalizejson_normalize直接拍扁importpandasaspdfrompandasimportjson_normalize data{id:1,name:Alice,info:{age:25,city:Beijing}}# 直接展平dfjson_normalize(data)print(df)# 输出列名: id, name, info.age, info.cityjson_normalize-结合record_path、metarecord_path指定列表在哪里和 meta保留外层信息frompandasimportjson_normalize data[{user_id:101,profile:{name:Bob},orders:[{product:Book,price:20},{product:Pen,price:2}]}]# record_path: 指向那个“列表”字段这会让每一行变成一个订单# meta: 把上层的 ID 和名字“提”出来拼接到每一行dfjson_normalize(data,record_pathorders,meta[user_id,[profile,name]]# 嵌套字段要用列表表示路径)print(df)输出结果product price user_id profile.name0Book20101Bob1Pen2101Bob