panda 函数-处理空值

本文介绍了使用 Python 的 Pandas 库进行数据处理的方法,包括数据清洗、缺失值处理、分层索引等高级功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


今天这里谈的函数,以后进行数据分析的时候会经常用到。



import numpy as np
import pandas as pd
from pandas import DataFrame , Series
from numpy import nan as NA
obj = Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c'])

uniques = obj.unique()
print("obj is \n", obj)
print("obj.unique is \n ", obj.unique())
print("uniques.sort() is \n", uniques.sort())

print("obj.value_counts() is \n", obj.value_counts())
print("pd.value_counts(obj.values,sort=False) \n", pd.value_counts(obj.values, sort=False))

mask = obj.isin(['b' , 'c'])
print("obj.isin(['b','c']) \n", obj.isin(['b' , 'c']))
print("mask = obj.isin(['b','c'])")
print("obj[mask] is \n", obj[mask])

data= DataFrame(
    {
        'Qu1':[1,3,4,3,4],
        'Qu2':[2,3,1,2,3],
        'Qu3':[1,5,2,4,4]
    }
)

print ("data is \n",data)
result = data.apply(pd.value_counts).fillna(0)

print("data.apply(pd.value_counts).fillna(0)\n ", result)
print("计算一个series各值出现的频率")

print("handling the missing data \n")
string_data = Series(['aardvark','artichoke',np.nan,'avocado'])
print("string_data is \n", string_data)
print("string_data.isnull() \n",string_data.isnull())

print("The built-in python None value is also treated as NA in object Arrays \n")
print("string_data[0]=None\n")
string_data[0]=None
print("string_data.isnull() \n ",string_data.isnull)

print(" NA handling methods in P143 Table 5-12")
data = Series([1,NA,3.5,NA,7])
data.dropna()
print("data is \n",data)
print("data.dropna() is \n", data.dropna())
print("data[data.notnull()],\n",data[data.notnull()])

data = DataFrame([[1.,6.5,3.],[1.,NA,NA],[NA,NA,NA],[NA,6.5,3.]])
cleaned = data.dropna()

print("data is \n",data)
print("data.dropna() is \n",cleaned)
print("data.dropna(how='all') is \n", data.dropna(how='all'))
print("passing how=all will only drop rows that are all NA")

data[4]=NA
print("New data is \n", data)
print("data.dropna(axis=1,how='all') \n",data.dropna(axis=1,how='all'))
print("按照columns drop")

df=DataFrame(np.random.randn(7,3))
print("df is \n",df)
df.ix[:4,1]=NA
df.ix[:2,2]=NA
print("New df is \n",df)
print("df.dropna(thresh=3)\n",df.dropna(thresh=3))

print("filling in the missing data")
print("df.fillna(0) \n",df.fillna(0))
print("df.fillna({1:0.5,3:-1}) \n",df.fillna({1:0.5,3:-1}))
print("calling fillna with a dict you can use a different fill value for each columns")

_=df.fillna(0,inplace=True)
print("_=df.fillna(0,inplace=True) \n",df)

df=DataFrame(np.random.randn(6,3))
print("DataFrame(np.random.randn(6,3)) \n",df)
df.ix[2:,1] = NA
df.ix[4:,2] = NA
print("df.ix[2:,1] = NA; df.ix[4:,2] = NA \n",df )

print("df.fillna(method = 'ffill') \n", df.fillna(method = 'ffill'))

print("df.fillna(method = 'ffill',limit =2) \n",df.fillna(method='ffill',limit = 2))

data= Series([1.,NA,3.5,NA,7])
print("data is \n",data)
print("data.fillna(data.mean()) \n",data.fillna(data.mean()))

print("fillna function arguments on P146 Table 5-13")
print("Hierarchical indexing")
data = Series(np.random.randn(10),index=[['a','a','a','b','b','b','c','c','d','d'],[1,2,3,1,2,3,1,2,2,3]])
print("data is \n",data)
print("a Series with multi-index")
print("data.index",data.index)
print("data['b'] \n",data['b'])
print("data['b':'c'] \n",data['b':'c'])
print("data.ix[['b','d']] \n",data.ix[['b','d']])

print("data[:,2] \n",data[:,2])
print("data.unstack() \n",data.unstack())

print("data.unstack().stack() \n ",data.unstack().stack())

print("data frame")
frame = DataFrame(np.arange(12).reshape((4,3)),index=[['a','a','b','b'],[1,2,1,2]],columns=[['Ohio','Ohio','Colorado'],['Green','Red','Green']])
print("frame is \n",frame)
frame.index.names =["key1","key2"]
frame.columns.names=["state","color"]
print("New frame is \n",frame)

print("frame['Ohio'] \n",frame['Ohio'])
print("frame.swaplevel('key1','key2') \n", frame.swaplevel('key1','key2'))

print("frame.sortlevel(1) \n",frame.sortlevel(1))
print("frame.swaplevel(0,1).sortlevel(0)\n",frame.swaplevel(0,1).sortlevel(0))

print("summary statistics by level")
print("frame.sum(level='key2') \n",frame.sum(level='key2'))
print("frame.sum(level='color',axis=1) \n",frame.sum(level='color',axis = 1))

print("Using a DataFrame's columns")
frame = DataFrame({'a':range(7),'b':range(7,0,-1),'c':['one','one','one','two','two','two','two'],'d':[0,1,2,0,1,2,3]})
print("frame is \n",frame)
frame2= frame.set_index(['c','d'])
print("creating a new Dataframe using one or more its columns as the index")
print("frame.set_index(['c','d']) \n",frame2)

frame.set_index(['c','d'],drop=False)
print("frame.set_index(['c','d'],drop =False) \n",frame.set_index(['c','d'],drop=False))

print("reset_index does the opposite of set_index,the hierarchical index levels are moved into the columns")
print("frame2.reset_index() \n",frame2.reset_index())

http://www.xuebuyuan.com/2180572.html

转载于:https://www.cnblogs.com/wutongyuhou/p/6888148.html

<think>由于无法安装pandas,我们需要使用其他Python标准库或轻量级库来处理Excel文件。这里我们可以使用:1.`xlrd`和`xlwt`来处理旧版Excel(.xls),但无法处理.xlsx格式的写入(xlwt只支持xls)2. `openpyxl`来处理.xlsx格式(读写)但是,合并多个文件且列不一致时,我们需要一个更灵活的方式。由于不能使用pandas,我们将手动处理:步骤:a.读取所有Excel文件,收集所有列名(去重) b.为每个文件创建一个二维列表(包括数据),并补全缺失列为空值c.将所有数据合并到一个大列表d.按照指定列排序(这里需要手动实现排序,因为数据量可能大,但考虑到95个文件,数据量不会太大)e.使用openpyxl写入新的Excel文件注意:由于没有pandas,排序需要自己实现,我们可以使用内置的sorted函数,但需要指定key。但是,由于无法安装pandas,我们假设可以安装openpyxl(因为它是处理xlsx的常用库,且不需要pandas依赖)。如果连openpyxl都不能安装,则需要考虑其他方法(如使用csv格式?但题目要求是Excel)。这里我们假设可以安装openpyxl,使用它来读写Excel文件。方案:1.使用openpyxl读取每个文件,获取所有列名和数据。2.收集所有列名(去重)并排序(为了输出列顺序一致,我们按列名的字母顺序排序?但题目没有要求列顺序,可以按出现顺序?但为了可预测,我们按字母顺序排)3.为每个文件的数据行补全缺失的列(用None表示白)4.合并所有数据行5.按照指定列排序(申请日、当前申请(专利权)人州/省),注意:日期需要转换,但题目中“申请日”可能是字符串或日期格式,我们按字符串处理?或者使用日期格式?这里假设是字符串,因为openpyxl读取日期可能是datetime对象,也可能是字符串(取决于Excel格式)。为了通用,我们按字符串比较。但是,排序时如果遇到日期格式,字符串比较可能不准确(例如2020/1/1和2020-1-1),所以最好统一转换为日期对象。但考虑到复杂度,且题目没有明确日期格式,我们按字符串处理。6.将合并后的数据写入新的Excel文件。由于没有pandas,这个操作会复杂一些,代码量也会增加。步骤详细代码:注意:由于文件数量多(95个),我们使用进度条(tqdm)可选,如果也不能安装tqdm,则去掉。安装必须库(如果允许):pip installopenpyxl tqdm如果tqdm不能安装,则用普通循环。代码实现:</think># 不使用Pandas合并Excel文件的替代方案 当无法安装Pandas库时,可以使用Python标准库和轻量级第三方库来处理Excel文件合并。以下是使用`openpyxl`和`xlrd`库实现的替代方案: ```python import os from openpyxl import Workbook, load_workbook from collections import defaultdict import xlrd def merge_excels_without_pandas(input_folder, output_file): """ 不使用Pandas合并Excel文件的解决方案 :param input_folder: 输入文件夹路径 :param output_file: 输出文件路径 """ # 1. 获取所有Excel文件 excel_files = [f for f in os.listdir(input_folder) if f.endswith(('.xlsx', '.xls'))] # 2. 收集所有列名和对应的数据类型 all_columns = set() file_data = [] print("收集文件信息...") for file in excel_files: file_path = os.path.join(input_folder, file) if file.endswith('.xlsx'): wb = load_workbook(file_path, read_only=True, data_only=True) sheet = wb.active headers = [cell.value for cell in sheet[1]] data = [] for row in sheet.iter_rows(min_row=2, values_only=True): data.append(row) wb.close() else: # 处理.xls文件 wb = xlrd.open_workbook(file_path) sheet = wb.sheet_by_index(0) headers = [sheet.cell_value(0, col) for col in range(sheet.ncols)] data = [] for row_idx in range(1, sheet.nrows): data.append([sheet.cell_value(row_idx, col) for col in range(sheet.ncols)]) wb.release_resources() all_columns.update(headers) file_data.append((headers, data)) # 3. 创建统一的列顺序 sorted_columns = sorted(list(all_columns)) column_index_map = {col: idx for idx, col in enumerate(sorted_columns)} # 4. 创建新工作簿并设置列头 output_wb = Workbook() output_ws = output_wb.active output_ws.append(sorted_columns) # 5. 合并所有数据 print("合并数据...") all_rows = [] for headers, data in file_data: header_map = {header: idx for idx, header in enumerate(headers)} for row in data: new_row = [None] * len(sorted_columns) for col in headers: if col in column_index_map: col_idx = column_index_map[col] orig_idx = header_map[col] new_row[col_idx] = row[orig_idx] all_rows.append(new_row) # 6. 按申请日和州/省排序 try: date_col_idx = sorted_columns.index("申请日") province_col_idx = sorted_columns.index("当前申请(专利权)人州/省") all_rows.sort(key=lambda x: ( x[date_col_idx] if x[date_col_idx] is not None else "9999-99-99", x[province_col_idx] if x[province_col_idx] is not None else "" )) except ValueError: print("警告: 排序列不存在,跳过排序") # 7. 写入数据 for row in all_rows: output_ws.append(row) # 8. 保存文件 output_wb.save(output_file) print(f"合并完成! 共处理 {len(excel_files)} 个文件") print(f"总行数: {len(all_rows)}") print(f"输出文件: {output_file}") # 使用示例 if __name__ == "__main__": input_folder = "patent_data" # 存放Excel的文件夹 output_file = "merged_patents.xlsx" # 输出文件名 merge_excels_without_pandas(input_folder, output_file) ``` ## 代码说明 ### 1. 依赖库说明 - **openpyxl**: 用于处理.xlsx格式文件 - **xlrd**: 用于处理.xls格式文件 - 这两个库通常比Pandas更轻量,安装更容易 ### 2. 安装方法 ```bash pip install openpyxl xlrd ``` ### 3. 核心处理逻辑 1. **文件收集**: - 遍历文件夹获取所有Excel文件 - 区分.xlsx和.xls格式使用不同库处理 2. **数据读取**: - 读取每个文件的表头和所有行数据 - 使用`read_only=True`模式优化内存使用 3. **列名统一**: - 收集所有文件中出现的列名 - 创建统一的列顺序 4. **数据转换**: - 为每个数据行创建新数组,长度与总列数一致 - 将原始数据映射到新数组的正确位置 - 缺失列位置填充`None` 5. **排序处理**: - 尝试按"申请日"和"州/省"排序 - 处理可能的缺失值,将空值排在最后 6. **结果保存**: - 使用openpyxl创建新工作簿 - 先写入列头,再写入所有数据行 ### 4. 优势与限制 **优势**: - 无需安装Pandas - 内存占用较低(逐行处理- 支持.xls和.xlsx两种格式 **限制**: - 处理速度可能比Pandas慢 - 不支持复杂Excel功能(公式、格式等) - 需要手动处理数据类型转换 ## 替代方案:使用CSV格式 如果Excel格式不是必须的,可以转换为CSV格式处理: ```python import os import csv def merge_csv_files(input_folder, output_file): """合并CSV文件方案""" csv_files = [f for f in os.listdir(input_folder) if f.endswith('.csv')] all_columns = set() all_rows = [] # 收集所有列名和数据 for file in csv_files: file_path = os.path.join(input_folder, file) with open(file_path, 'r', encoding='utf-8-sig') as f: reader = csv.DictReader(f) headers = reader.fieldnames all_columns.update(headers) for row in reader: all_rows.append(row) # 写入合并文件 with open(output_file, 'w', encoding='utf-8-sig', newline='') as f: writer = csv.DictWriter(f, fieldnames=sorted(all_columns)) writer.writeheader() writer.writerows(all_rows) print(f"合并完成! 共合并 {len(csv_files)} 个CSV文件") # 使用前先将Excel转换为CSV ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值