Python | Pandas | 多种类型文件的读取写入及初步处理
此文主要介绍如何使用pandas读取Excel、csv等类型文件的内容,对内容做初步处理,以及将内容写入目标文件类型的文件。
此文主要介绍如何使用pandas读取Excel、csv等类型文件的内容,对内容做初步处理 1,以及将内容写入目标文件类型的文件。
Last Modified Date: 2023 / 1 / 18
Python | Pandas | 多种类型文件的读取与写入
读取及写入
参考 2
读取
字符串
以下面的字符串为例 3,演示如何将字符串格式的内容读取为 dataframe
格式的数据。
data = '''
day code pe_ratio pb_ratio market_cap
2016-03-01 002027.XSHE 34.5035 25.4271 1169.3248
2016-03-02 002027.XSHE 36.0459 26.5638 1221.5966
2016-03-03 002027.XSHE 35.7059 26.3132 1210.0721
2016-03-04 002027.XSHE 36.1309 26.6264 1224.4777
'''
df = pd.read_csv(io.StringIO(data), delim_whitespace=True)
print(df)
# day code pe_ratio pb_ratio market_cap
# 0 2016-03-01 002027.XSHE 34.5035 25.4271 1169.3248
# 1 2016-03-02 002027.XSHE 36.0459 26.5638 1221.5966
# 2 2016-03-03 002027.XSHE 35.7059 26.3132 1210.0721
# 3 2016-03-04 002027.XSHE 36.1309 26.6264 1224.4777
Excel
下文中使用的原始数据参考此处 4,相关知识点可参考此处 5’ 6’ 7,源代码参考此处 8。
data = pd.read_excel(
io,
sheet_name=0,
header=0,
names=None,
index_col=None,
usecols=None,
squeeze=False,
dtype=None,
engine=None,
converters=None,
true_values=None,
false_values=None,
skiprows=None,
nrows=None,
na_values=None,
keep_default_na=True,
na_filter=True,
verbose=False,
parse_dates=False,
date_parser=None,
thousands=None,
decimal='',
comment=None,
skipfooter=0,
convert_float=True,
mangle_dupe_cols=True,
storage_options=None
)
-
io
文件路径,可以是绝对路径或者相对路径
data = pd.read_excel(io='RawData.xlsx')
# data.head(3)
# '''
# id uid ... diqu city
# 0 553217640 6376967.0 ... 广西 南宁市
# 1 553217639 6376967.0 ... 广西 南宁市
# 2 553217638 6571870.0 ... 浙江省 杭州市
#
# [3 rows x 11 columns]
# '''
-
sheetname
指定读取的sheet
名。可以是数字,sheet
名,以列表形式表现的sheet
名。
- 在未指定的情况下
sheetname
默认为0
,即读取第一个sheet
;sheet_name = 1
,读取第二个sheet
;sheet_name = "主营首版"
,读取名为主营首版
的sheet
;sheet_name = [0,1,'主营首版']
,同时读取列表中的sheet
;sheet_name = None
,读取所有的sheet
注意:int/string返回的是dataframe,而none和list返回的是dict of dataframe。
-
header
指定作为列名的行
- 不指定
header
则默认第一行为标题行, 数据为列名行以下的数据;header = 1
,从第2行开始读取数据,并且将第2行设置为标题行;header = [0,1]
,第一行和第二行为标题行;header = None
,没有标题行,所有都是数据;
-
names
指定列的名字,传入一个list数据
在header=None
的前提下,传入1个list
数据(列表长度应同dataframe
的列数一致)以指定列的名字
data = pd.read_excel(io='RawData.xlsx')
# data.head(3)
# '''
# id uid ... diqu city
# 0 553217640 6376967.0 ... 广西 南宁市
# 1 553217639 6376967.0 ... 广西 南宁市
# 2 553217638 6571870.0 ... 浙江省 杭州市
#
# [3 rows x 11 columns]
# '''
names = ['user', 'uid', 'title', ..., 'province', 'city']
data = pd.read_excel(io='RawData.xlsx', names=names)
# data.head(3)
# '''
# user uid ... province city
# 0 553217640 6376967.0 ... 广西 南宁市
# 1 553217639 6376967.0 ... 广西 南宁市
# 2 553217638 6571870.0 ... 浙江省 杭州市
#
# [3 rows x 11 columns]
# '''
-
index_col
指定列为索引列
- 默认为
None
,即索引默认为0
开始的数字;index_col = 0
,将第一列设置为索引;index_col=[0,1]
,将第一列和第二列设置为索引,其余列为数据;header
如果为1
,则第一行数据就会被抛弃,index_col
如果为1
,第一列的数据会自动后移和其他数据合并在一起,不会被抛弃
-
usecols
用于指定读取的列,int
或list
,默认为None
。
- 如果为
None
, 则解析所有列;- 如果为
int
, 则表示要解析的最后一列;- 如果为
int
列表, 则表示要解析的列号列表;- 如果字符串, 则表示以逗号分隔的Excel列字母和列范围列表(例如
'A:E'
或'A,C,E:F'
)。范围包括双方。
-
squeeze
- 如果源数据或者读取的数据只有一列,
squeeze = False
时读取的结果是*行1列
的dataframe
结构;- 如果
squeeze = True
时读取的结果是一个Series
结构;
-
dtype
- 列的类型名称或字典,默认为
None
。- 数据或列的数据类型。例如
{'a':np.float64,'b':np.int32}
使用对象保存存储在Excel
中的数据而不解释dtype
。
如果指定了转换器,则它们将应用于dtype
转换的INSTEAD
。
-
engine
略 -
converters
converters={"可滚动收入":lambda x: x/100,"收入":lambda x: x/100}
, 即可将可滚动收入
和收入
的数值都除以100
-
skiprows
省略指定行数的数据,从省略的行数后的第一行开始 -
skip_footer
省略指定行数的数据,是从尾部数的行开始。
CSV
参考 9
data = pd.read_csv(
filepath_or_buffer: FilePathOrBuffer,
sep=lib.no_default,
delimiter=None,
# Column and Index Locations and Names
header="infer",
names=lib.no_default,
index_col=None,
usecols=None,
squeeze=False,
prefix=lib.no_default,
mangle_dupe_cols=True,
# General Parsing Configuration
dtype: DtypeArg | None = None,
engine=None,
converters=None,
true_values=None,
false_values=None,
skipinitialspace=False,
skiprows=None,
skipfooter=0,
nrows=None,
# NA and Missing Data Handling
na_values=None,
keep_default_na=True,
na_filter=True,
verbose=False,
skip_blank_lines=True,
# Datetime Handling
parse_dates=False,
infer_datetime_format=False,
keep_date_col=False,
date_parser=None,
dayfirst=False,
cache_dates=True,
# Iteration
iterator=False,
chunksize=None,
# Quoting, Compression, and File Format
compression="infer",
thousands=None,
decimal: str = ".",
lineterminator=None,
quotechar='"',
quoting=csv.QUOTE_MINIMAL,
doublequote=True,
escapechar=None,
comment=None,
encoding=None,
encoding_errors: str | None = "strict",
dialect=None,
# Error Handling
error_bad_lines=None,
warn_bad_lines=None,
# TODO (2.0): set on_bad_lines to "error".
# See _refine_defaults_read comment for why we do this.
on_bad_lines=None,
# Internal
delim_whitespace=False,
low_memory=_c_parser_defaults["low_memory"],
memory_map=False,
float_precision=None,
storage_options: StorageOptions = None,
)
-
filepath_or_buffer
数据输入的路径:可以是文件路径、可以是URL,也可以是实现read方法的任意对象。 -
header
设置导入 DataFrame 的列名称,默认为 “infer”,注意它与下面介绍的 names 参数的微妙关系:
当names没被赋值时,header会变成0,即选取数据文件的第一行作为列名。
当 names 被赋值,header 没被赋值时,那么header会变成None。
如果都赋值,就会实现两个参数的组合功能。 -
keep_default_na
通过na_values
参数可以让 pandas 在读取 CSV 的时候将一些指定的值替换成空值,但除了na_values
指定的值之外,还有一些默认的值也会在读取的时候被替换成空值。
不过有些时候我们不希望这么做,比如有一个具有业务含义的字符串恰好就叫 “NA”,那么就可以将keep_default_na
指定为 False,默认为 True,如果指定为 False,那么 pandas 在读取时就不会擅自将那些默认的值转成空值了,它们在 CSV 中长什么样,pandas 读取出来之后就还长什么样,即使单元格中啥也没有,那么得到的也是一个空字符串。
写入
Excel
参考 10
单表
将 data
写入 folder
下的 1Sheet.xlsx
并存为 Sheet-1
,其中浮点数都只保存两位小数 11,空白数值被填充为字符串 Empty
, 并且不保存index。
data.to_excel(folder+'/1Sheet.xlsx',
sheet_name='Sheet-1',
float_format='%.2f',
na_rep='Empty',
index=False)
多表
将data
写入folder
下的2Sheets.xlsx
并存为Sheet-1
以及Sheet-2
,当然,这里可以写不同的数据,而不是在2张表中都写入data
,其中时间以年月日的形式显示。
with pd.ExcelWriter(
folder+'/2Sheets.xlsx',
datetime_format='YYYY-MM-DD') as writer:
data.to_excel(writer, sheet_name='Sheet-1')
data.to_excel(writer, sheet_name='Sheet-2')
CSV
处理
查找与替换
非空值
Pandas
中的 replace
方法 9 允许您在 DataFrame 中的指定系列中搜索值,以查找随后可以更改的值或子字符串。
比如,处理对象为一个列字段为film
的列,在处理对象的值中查找Of The
并替换为of the
,
df["Film"].replace("Of The", "of the", regex=True)
空值
fillna()
方法可以对空值 14 进行替换处理。
比如,将原始数据中的数学成绩
列中的空值填充为0
。
df['数学成绩'].fillna(0, inplace=True)
删改
参考此处 15。
指定列 / 行
drop()
方法可以对指定行 / 列进行删除。
df.drop(
labels=None,
axis=0
index=None,
columns=None,
level=0,
inplace=False,
errors="ignore"
)
-
labels
-
axis
-
index
-
columns
-
level
-
inplace
-
errors
去重
drop_duplicates()
方法可以对存在重复值的行进行去重。
df.drop_duplicates(
subset=None,
keep='first',
inplace=False,
ignore_index=False
)
-
subset
可以指定传入单个列标签或者一个列标签的列表,默认是使用所有的列标签,即会删除一整行 -
keep
有{‘first’, ‘last’, False}
三个可供选择, 默认为first
,意味着除了第一个后面重复的全部删除 -
inplace
返回是否替代过的值,默认False
, 即不改变原数据。 -
ignore_index
参考文章

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)