此文主要介绍如何使用pandas读取Excel、csv等类型文件的内容,对内容做初步处理 1,以及将内容写入目标文件类型的文件。

Last Modified Date: 2023 / 1 / 18



读取及写入

参考 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,相关知识点可参考此处 567,源代码参考此处 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
    用于指定读取的列, intlist,默认为 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

参考此处 1213


处理

查找与替换

非空值

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

参考文章

%todo
python数据分析:Pandas之Series


  1. 【十分钟Python知识点】pandas最详细教程 ↩︎

  2. pandas 文件或数据的读取和导出 ↩︎

  3. pandas的妙用:快速定位最大值最小值 ↩︎

  4. 本文所使用源代码 ↩︎

  5. 【python】pandas库pd.read_excel操作读取excel文件参数整理与实例 ↩︎

  6. pandas读取excel文件 pandas.read_excel参数详解 ↩︎

  7. Pandas库read_excel()参数详解 ↩︎

  8. _base.py ↩︎

  9. 详解pandas的read_csv方法 ↩︎ ↩︎

  10. pandas 的 DataFrame 输出成 excel 表格, 输出多个子表 sheet ↩︎

  11. Python格式化输出——format ↩︎

  12. python输出空行_Python中通过csv的writerow输出的内容有多余的空行两种方法 ↩︎

  13. python写入csv文件的几种方法总结 ↩︎

  14. 将DataFrame某列中的空值填充为0 ↩︎

  15. 【python】详解pandas dataframe 去重函数 pandas.DataFrame.drop_duplicates ↩︎

Logo

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

更多推荐