百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python中使用pandas进行文件读取和写入方法详解

off999 2024-10-08 06:16 31 浏览 0 评论

Pandas 是 Python 的一个功能强大且灵活的三方包,可处理标记和时间序列数据。还提供统计方法、启用绘图等功能。Pandas 的一项重要功能是能够编写和读取 Excel、CSV 和许多其他类型的文件并且能有效地进行处理文件。

文章目录

pandas 的安装

在你所在的开发环境命令行输入。如果默认用的Anaconda安装的话可以略过此过程。

pip install pandas

数据的准备

使用 20 个国家/地区相关的数据。数据的列的说明如下:

  • Country 表示国家名称。
  • Population 单位百万计算。
  • Area 千平方公里为单位。
  • GDP 国内生产总值以百万美元表示。
  • Continent 非洲、亚洲、大洋洲、欧洲、北美洲或南美洲。
  • Independence day 独立日是纪念一个国家独立的日子。

SHORT_NAME

COUNTRY

POP

AREA

GDP

CONT

IND_DAY

CHN

China

1398.72

9596.96

12234.78

Asia

1949-10-01

IND

India

1351.16

3287.26

2575.67

Asia

1947-08-15

USA

US

329.74

9833.52

19485.39

N.America

1776-07-04

IDN

Indonesia

268.07

1910.93

1015.54

Asia

1945-08-17

BRA

Brazil

210.32

8515.77

2055.51

S.America

1822-09-07

PAK

Pakistan

205.71

881.91

302.14

Asia

1947-08-14

NGA

Nigeria

200.96

923.77

375.77

Africa

1960-10-01

BGD

Bangladesh

167.09

147.57

245.63

Asia

1971-03-26

RUS

Russia

146.79

17098.25

1530.75


1992-06-12

MEX

Mexico

126.58

1964.38

1158.23

N.America

1810-09-16

JPN

Japan

126.22

377.97

4872.42

Asia


DEU

Germany

83.02

357.11

3693.2

Europe


FRA

France

67.02

640.68

2582.49

Europe

1789-07-14

GBR

UK

66.44

242.5

2631.23

Europe


ITA

Italy

60.36

301.34

1943.84

Europe


ARG

Argentina

44.94

2780.4

637.49

S.America

1816-07-09

DZA

Algeria

43.38

2381.74

167.56

Africa

1962-07-05

CAN

Canada

37.59

9984.67

1647.12

N.America

1867-07-01

AUS

Australia

25.47

7692.02

1408.68

Oceania


KAZ

Kazakhstan

18.53

2724.9

159.41

Asia

1991-12-16

看到上面的数据有部分是丢失的。使用嵌套字典的方式记录这些数据。

data = {
 
    'CHN': {
 'COUNTRY': 'China', 'POP': 1_398.72, 'AREA': 9_596.96,
            'GDP': 12_234.78, 'CONT': 'Asia', 'IND_DAY': '1949-10-01'},
    'IND': {
 'COUNTRY': 'India', 'POP': 1_351.16, 'AREA': 3_287.26,
            'GDP': 2_575.67, 'CONT': 'Asia', 'IND_DAY': '1947-08-15'},
    'USA': {
 'COUNTRY': 'US', 'POP': 329.74, 'AREA': 9_833.52,
            'GDP': 19_485.39, 'CONT': 'N.America',
            'IND_DAY': '1776-07-04'},
    'IDN': {
 'COUNTRY': 'Indonesia', 'POP': 268.07, 'AREA': 1_910.93,
            'GDP': 1_015.54, 'CONT': 'Asia', 'IND_DAY': '1945-08-17'},
    'BRA': {
 'COUNTRY': 'Brazil', 'POP': 210.32, 'AREA': 8_515.77,
            'GDP': 2_055.51, 'CONT': 'S.America', 'IND_DAY': '1822-09-07'},
    'PAK': {
 'COUNTRY': 'Pakistan', 'POP': 205.71, 'AREA': 881.91,
            'GDP': 302.14, 'CONT': 'Asia', 'IND_DAY': '1947-08-14'},
    'NGA': {
 'COUNTRY': 'Nigeria', 'POP': 200.96, 'AREA': 923.77,
            'GDP': 375.77, 'CONT': 'Africa', 'IND_DAY': '1960-10-01'},
    'BGD': {
 'COUNTRY': 'Bangladesh', 'POP': 167.09, 'AREA': 147.57,
            'GDP': 245.63, 'CONT': 'Asia', 'IND_DAY': '1971-03-26'},
    'RUS': {
 'COUNTRY': 'Russia', 'POP': 146.79, 'AREA': 17_098.25,
            'GDP': 1_530.75, 'IND_DAY': '1992-06-12'},
    'MEX': {
 'COUNTRY': 'Mexico', 'POP': 126.58, 'AREA': 1_964.38,
            'GDP': 1_158.23, 'CONT': 'N.America', 'IND_DAY': '1810-09-16'},
    'JPN': {
 'COUNTRY': 'Japan', 'POP': 126.22, 'AREA': 377.97,
            'GDP': 4_872.42, 'CONT': 'Asia'},
    'DEU': {
 'COUNTRY': 'Germany', 'POP': 83.02, 'AREA': 357.11,
            'GDP': 3_693.20, 'CONT': 'Europe'},
    'FRA': {
 'COUNTRY': 'France', 'POP': 67.02, 'AREA': 640.68,
            'GDP': 2_582.49, 'CONT': 'Europe', 'IND_DAY': '1789-07-14'},
    'GBR': {
 'COUNTRY': 'UK', 'POP': 66.44, 'AREA': 242.50,
            'GDP': 2_631.23, 'CONT': 'Europe'},
    'ITA': {
 'COUNTRY': 'Italy', 'POP': 60.36, 'AREA': 301.34,
            'GDP': 1_943.84, 'CONT': 'Europe'},
    'ARG': {
 'COUNTRY': 'Argentina', 'POP': 44.94, 'AREA': 2_780.40,
            'GDP': 637.49, 'CONT': 'S.America', 'IND_DAY': '1816-07-09'},
    'DZA': {
 'COUNTRY': 'Algeria', 'POP': 43.38, 'AREA': 2_381.74,
            'GDP': 167.56, 'CONT': 'Africa', 'IND_DAY': '1962-07-05'},
    'CAN': {
 'COUNTRY': 'Canada', 'POP': 37.59, 'AREA': 9_984.67,
            'GDP': 1_647.12, 'CONT': 'N.America', 'IND_DAY': '1867-07-01'},
    'AUS': {
 'COUNTRY': 'Australia', 'POP': 25.47, 'AREA': 7_692.02,
            'GDP': 1_408.68, 'CONT': 'Oceania'},
    'KAZ': {
 'COUNTRY': 'Kazakhstan', 'POP': 18.53, 'AREA': 2_724.90,
            'GDP': 159.41, 'CONT': 'Asia', 'IND_DAY': '1991-12-16'}
}

columns = ('COUNTRY', 'POP', 'AREA', 'GDP', 'CONT', 'IND_DAY')

通过创建 pandas 实例 DataFrame 加载 data 数据。

import pandas as pd
df = pd.DataFrame(data).T
df

        COUNTRY      POP     AREA      GDP       CONT     IND_DAY
CHN       China  1398.72  9596.96  12234.8       Asia         NaN
IND       India  1351.16  3287.26  2575.67       Asia  1947-08-15
USA          US   329.74  9833.52  19485.4  N.America  1776-07-04
IDN   Indonesia   268.07  1910.93  1015.54       Asia  1945-08-17
BRA      Brazil   210.32  8515.77  2055.51  S.America  1822-09-07
PAK    Pakistan   205.71   881.91   302.14       Asia  1947-08-14
NGA     Nigeria   200.96   923.77   375.77     Africa  1960-10-01
BGD  Bangladesh   167.09   147.57   245.63       Asia  1971-03-26
RUS      Russia   146.79  17098.2  1530.75        NaN  1992-06-12
MEX      Mexico   126.58  1964.38  1158.23  N.America  1810-09-16
JPN       Japan   126.22   377.97  4872.42       Asia         NaN
DEU     Germany    83.02   357.11   3693.2     Europe         NaN
FRA      France    67.02   640.68  2582.49     Europe  1789-07-14
GBR          UK    66.44    242.5  2631.23     Europe         NaN
ITA       Italy    60.36   301.34  1943.84     Europe         NaN
ARG   Argentina    44.94   2780.4   637.49  S.America  1816-07-09
DZA     Algeria    43.38  2381.74   167.56     Africa  1962-07-05
CAN      Canada    37.59  9984.67  1647.12  N.America  1867-07-01
AUS   Australia    25.47  7692.02  1408.68    Oceania         NaN
KAZ  Kazakhstan    18.53   2724.9   159.41       Asia  1991-12-16

CSV文件的写入和读取

逗号分隔值 (CSV) 是包含.csv包含表格数据的扩展名的纯文本文件。用于存储大量数据的最流行的文件格式之一。CSV 文件的每一行代表一个表格行。默认情况下同一行中的值用逗号分隔,也可以将分隔符更改为分号、制表符、空格或其他字符。

编写 CSV 文件

使用 to_csv() 方法进行文件生成。

df.to_csv('data.csv')

此文本文件包含用逗号分隔的数据。第一列包含行索引,可以使用 index=False 方法不保留该索引。

读取 CSV 文件

将数据保存在 CSV 文件中后,可能需要不时加载和使用。要使用到 read_csv() 方法。

df = pd.read_csv('data.csv', index_col=0)
print(df)
        COUNTRY      POP      AREA       GDP       CONT     IND_DAY
CHN       China  1398.72   9596.96  12234.78       Asia  1949-10-01
IND       India  1351.16   3287.26   2575.67       Asia  1947-08-15
USA          US   329.74   9833.52  19485.39  N.America  1776-07-04
IDN   Indonesia   268.07   1910.93   1015.54       Asia  1945-08-17
BRA      Brazil   210.32   8515.77   2055.51  S.America  1822-09-07
PAK    Pakistan   205.71    881.91    302.14       Asia  1947-08-14
NGA     Nigeria   200.96    923.77    375.77     Africa  1960-10-01
BGD  Bangladesh   167.09    147.57    245.63       Asia  1971-03-26
RUS      Russia   146.79  17098.25   1530.75        NaN  1992-06-12
MEX      Mexico   126.58   1964.38   1158.23  N.America  1810-09-16
JPN       Japan   126.22    377.97   4872.42       Asia         NaN
DEU     Germany    83.02    357.11   3693.20     Europe         NaN
FRA      France    67.02    640.68   2582.49     Europe  1789-07-14
GBR          UK    66.44    242.50   2631.23     Europe         NaN
ITA       Italy    60.36    301.34   1943.84     Europe         NaN
ARG   Argentina    44.94   2780.40    637.49  S.America  1816-07-09
DZA     Algeria    43.38   2381.74    167.56     Africa  1962-07-05
CAN      Canada    37.59   9984.67   1647.12  N.America  1867-07-01
AUS   Australia    25.47   7692.02   1408.68    Oceania         NaN
KAZ  Kazakhstan    18.53   2724.90    159.41       Asia  1991-12-16

index_col = 0的作用在行索引的列编号或者列名的指定,如果没有指定则会自动生成一列作为索引。

Excel文件的写入和读取

Microsoft Excel 是当下使用最广泛的电子表格软件。虽然旧版本使用二进制.xls文件,但 Excel 2007 引入了新的基于 XML 的.xlsx文件。可以在 Pandas 中读取和写入 Excel 文件,类似于 CSV 文件。

很多旧的教程里都会提到一些必备的三方包,例如:

  • xlwt 写入 .xls 文件
  • openpyx l或 XlsxWriter 写入 .xlsx 文件
  • xlrd 读取 Excel 文件

安装这些需要执行下面的命令,如果你是直接安装的Anacanda可以省略此步骤。

pip install xlwt openpyxl xlsxwriter xlrd

编写 Excel 文件

使用 to_excel() 方法进行文件生成。

df.to_excel('data.xlsx')

读取 Excel 文件

将数据保存在 Excel 文件中后,可能需要不时加载和使用。要使用到 read_excel() 方法。

>>> df = pd.read_excel('data.xlsx', index_col=0)
>>> df
        COUNTRY      POP      AREA       GDP       CONT     IND_DAY
CHN       China  1398.72   9596.96  12234.78       Asia  1949-10-01
IND       India  1351.16   3287.26   2575.67       Asia  1947-08-15
USA          US   329.74   9833.52  19485.39  N.America  1776-07-04
IDN   Indonesia   268.07   1910.93   1015.54       Asia  1945-08-17
BRA      Brazil   210.32   8515.77   2055.51  S.America  1822-09-07
PAK    Pakistan   205.71    881.91    302.14       Asia  1947-08-14
NGA     Nigeria   200.96    923.77    375.77     Africa  1960-10-01
BGD  Bangladesh   167.09    147.57    245.63       Asia  1971-03-26
RUS      Russia   146.79  17098.25   1530.75        NaN  1992-06-12
MEX      Mexico   126.58   1964.38   1158.23  N.America  1810-09-16
JPN       Japan   126.22    377.97   4872.42       Asia         NaN
DEU     Germany    83.02    357.11   3693.20     Europe         NaN
FRA      France    67.02    640.68   2582.49     Europe  1789-07-14
GBR          UK    66.44    242.50   2631.23     Europe         NaN
ITA       Italy    60.36    301.34   1943.84     Europe         NaN
ARG   Argentina    44.94   2780.40    637.49  S.America  1816-07-09
DZA     Algeria    43.38   2381.74    167.56     Africa  1962-07-05
CAN      Canada    37.59   9984.67   1647.12  N.America  1867-07-01
AUS   Australia    25.47   7692.02   1408.68    Oceania         NaN
KAZ  Kazakhstan    18.53   2724.90    159.41       Asia  1991-12-16

Pandas IO API

Pandas IO Tools允许将 Series 和 DataFrame 对象保存到剪贴板、对象或各种类型文件的 API,还支持从剪贴板、对象或文件加载数据。

文件的写入

Series 和 DataFrame 对象具有能够将数据和标签写入剪贴板或文件的方法。以 pattern 命名.to_<file-type>(),其中<file-type>是目标文件的类型。

除了之前介绍的 .to_csv().to_excel() 以外还有 .to_json().to_html().to_sql().to_pickle() 四种方法。

文件的读取

对应上面文件的写入对应读取的方法也是对应的, read_csv()read_excel() 以外还包括 .read_json().read_html().read_sql().read_pickle() 四种方法

不同文件类型的操作

CSV 文件

.to_csv()需要在括号中指定文件的路径,并且路径所执行的文件名后缀必须是csv,否则不会创建任何文件。

df = pd.DataFrame(data).T
s = df.to_csv()
print(s)

,COUNTRY,POP,AREA,GDP,CONT,IND_DAY
CHN,China,1398.72,9596.96,12234.78,Asia,1949-10-01
IND,India,1351.16,3287.26,2575.67,Asia,1947-08-15
USA,US,329.74,9833.52,19485.39,N.America,1776-07-04
IDN,Indonesia,268.07,1910.93,1015.54,Asia,1945-08-17
BRA,Brazil,210.32,8515.77,2055.51,S.America,1822-09-07
PAK,Pakistan,205.71,881.91,302.14,Asia,1947-08-14
NGA,Nigeria,200.96,923.77,375.77,Africa,1960-10-01
......

这里的 s 是字符串,而不是 csv 格式文件。

这时候会发现数据中会有缺失值,在未来进行数据分析、机器学习、深度学习业务的时候缺失值是一定要处理的。可以使用 pandas 自带处理缺失值的功能。不过首先要知道缺失值使用 nan(float型) 表示的,可以通过 float(‘nan’)、math.nan、numpy.nan 这三种方法获取对应的值。

获取 Russia 行 CONT 列的缺失值。

df.loc['RUS', 'CONT']
nan

对于保存 CSV 文件时想要标记出来缺失值的位置可以使用 na_rep 进行赋值的方法。

df.to_csv('new-data.csv', na_rep='(missing)')
......
RUS,Russia,146.79,17098.25,1530.75,(missing),1992-06-12
MEX,Mexico,126.58,1964.38,1158.23,N.America,1810-09-16
JPN,Japan,126.22,377.97,4872.42,Asia,(missing)
DEU,Germany,83.02,357.11,3693.2,Europe,(missing)
......

Pandas 读取文件时默认将空字符串 ( ‘’ ) 和 ‘nan’、’-nan’、‘NA’、‘N/A’、‘NaN’、‘null’ 视为缺失值。如果不想进行默认替换的话可以使用 keep_default_na=False(默认) ,如果需要替换成其他的标签可以使用 na_values

Pandas在读取文件时将其 ‘(missing)’ 替换为 nan 。

pd.read_csv('new-data.csv', index_col=0, na_values='(missing)')

        COUNTRY      POP      AREA       GDP       CONT     IND_DAY
CHN       China  1398.72   9596.96  12234.78       Asia  1949-10-01
IND       India  1351.16   3287.26   2575.67       Asia  1947-08-15
USA          US   329.74   9833.52  19485.39  N.America  1776-07-04
IDN   Indonesia   268.07   1910.93   1015.54       Asia  1945-08-17
BRA      Brazil   210.32   8515.77   2055.51  S.America  1822-09-07
PAK    Pakistan   205.71    881.91    302.14       Asia  1947-08-14
NGA     Nigeria   200.96    923.77    375.77     Africa  1960-10-01
BGD  Bangladesh   167.09    147.57    245.63       Asia  1971-03-26
RUS      Russia   146.79  17098.25   1530.75        NaN  1992-06-12
MEX      Mexico   126.58   1964.38   1158.23  N.America  1810-09-16
JPN       Japan   126.22    377.97   4872.42       Asia         NaN
DEU     Germany    83.02    357.11   3693.20     Europe         NaN
FRA      France    67.02    640.68   2582.49     Europe  1789-07-14
GBR          UK    66.44    242.50   2631.23     Europe         NaN
ITA       Italy    60.36    301.34   1943.84     Europe         NaN
ARG   Argentina    44.94   2780.40    637.49  S.America  1816-07-09
DZA     Algeria    43.38   2381.74    167.56     Africa  1962-07-05
CAN      Canada    37.59   9984.67   1647.12  N.America  1867-07-01
AUS   Australia    25.47   7692.02   1408.68    Oceania         NaN
KAZ  Kazakhstan    18.53   2724.90    159.41       Asia  1991-12-16

当数据读取加载成功后,默认的会分配数据类型到每个列,可以使用 .dtype 进行查看。

df = pd.read_csv('data.csv', index_col=0)
df.dtypes

COUNTRY     object
POP        float64
AREA       float64
GDP        float64
CONT        object
IND_DAY     object
dtype: object

使用 dtype 来指定所需的数据类型,也可以使用 parse_date 强制转换数据类型。

dtypes = {
 'POP': 'float32', 'AREA': 'float32', 'GDP': 'float32'}
df = pd.read_csv('data.csv', index_col=0, dtype=dtypes,parse_dates=['IND_DAY'])

df.dtypes
COUNTRY            object
POP               float32
AREA              float32
GDP               float32
CONT               object
IND_DAY    datetime64[ns]
dtype: object

df['IND_DAY'].head(11)
CHN   1949-10-01
IND   1947-08-15
USA   1776-07-04
IDN   1945-08-17
BRA   1822-09-07
PAK   1947-08-14
NGA   1960-10-01
BGD   1971-03-26
RUS   1992-06-12
MEX   1810-09-16
JPN          NaT

并且日数据可以进行格式化操作。

df = pd.read_csv('data.csv', index_col=0, parse_dates=['IND_DAY'])
df.to_csv('formatted-data.csv', date_format='%B %d, %Y')

,COUNTRY,POP,AREA,GDP,CONT,IND_DAY
CHN,China,1398.72,9596.96,12234.78,Asia,"October 01, 1949"
IND,India,1351.16,3287.26,2575.67,Asia,"August 15, 1947"
USA,US,329.74,9833.52,19485.39,N.America,"July 04, 1776"
IDN,Indonesia,268.07,1910.93,1015.54,Asia,"August 17, 1945"
BRA,Brazil,210.32,8515.77,2055.51,S.America,"September 07, 1822"
PAK,Pakistan,205.71,881.91,302.14,Asia,"August 14, 1947"
NGA,Nigeria,200.96,923.77,375.77,Africa,"October 01, 1960"
BGD,Bangladesh,167.09,147.57,245.63,Asia,"March 26, 1971"
RUS,Russia,146.79,17098.25,1530.75,,"June 12, 1992"
MEX,Mexico,126.58,1964.38,1158.23,N.America,"September 16, 1810"
JPN,Japan,126.22,377.97,4872.42,Asia,
DEU,Germany,83.02,357.11,3693.2,Europe,
FRA,France,67.02,640.68,2582.49,Europe,"July 14, 1789"
GBR,UK,66.44,242.5,2631.23,Europe,
ITA,Italy,60.36,301.34,1943.84,Europe,
ARG,Argentina,44.94,2780.4,637.49,S.America,"July 09, 1816"
DZA,Algeria,43.38,2381.74,167.56,Africa,"July 05, 1962"
CAN,Canada,37.59,9984.67,1647.12,N.America,"July 01, 1867"
AUS,Australia,25.47,7692.02,1408.68,Oceania,
KAZ,Kazakhstan,18.53,2724.9,159.41,Asia,"December 16, 1991"

保存 csv 文件的时还可以使用其他一些参数。

  • sep 表示值分隔符。
  • decimal 表示小数分隔符。
  • encoding 设置文件编码。
  • header 指定是否要在文件中写入列标签。
s = df.to_csv(sep=';', header=False)
print(s)
CHN;China;1398.72;9596.96;12234.78;Asia;1949-10-01
IND;India;1351.16;3287.26;2575.67;Asia;1947-08-15
USA;US;329.74;9833.52;19485.39;N.America;1776-07-04
IDN;Indonesia;268.07;1910.93;1015.54;Asia;1945-08-17
BRA;Brazil;210.32;8515.77;2055.51;S.America;1822-09-07
PAK;Pakistan;205.71;881.91;302.14;Asia;1947-08-14
NGA;Nigeria;200.96;923.77;375.77;Africa;1960-10-01
BGD;Bangladesh;167.09;147.57;245.63;Asia;1971-03-26
RUS;Russia;146.79;17098.25;1530.75;;1992-06-12
MEX;Mexico;126.58;1964.38;1158.23;N.America;1810-09-16
JPN;Japan;126.22;377.97;4872.42;Asia;
DEU;Germany;83.02;357.11;3693.2;Europe;
FRA;France;67.02;640.68;2582.49;Europe;1789-07-14
GBR;UK;66.44;242.5;2631.23;Europe;
ITA;Italy;60.36;301.34;1943.84;Europe;
ARG;Argentina;44.94;2780.4;637.49;S.America;1816-07-09
DZA;Algeria;43.38;2381.74;167.56;Africa;1962-07-05
CAN;Canada;37.59;9984.67;1647.12;N.America;1867-07-01
AUS;Australia;25.47;7692.02;1408.68;Oceania;
KAZ;Kazakhstan;18.53;2724.9;159.41;Asia;1991-12-16

JSON 文件

JSON 是 JavaScript 对象表示法。JSON 文件是用于数据交换的明文文件,遵循 ISO/IEC 21778:2017 和 ECMA-404标准 并使用 .json 作为后缀扩展名。Python 和 Pandas 提供了 json 的内置支持并且可以很好地处理 JSON 文件。

.to_json()保存数据到 json 文件。

df = pd.DataFrame(data).T
df.to_json('data-columns.json')

data-columns.json 有一个大字典,其中列标签作为键,对应的内部字典作为值。

index 结构 json 模式。

df.to_json('data-index.json', orient='index')

records 结构 json 模式。

df.to_json('data-records.json', orient='records')

split 结构 json 模式。

df.to_json('data-split.json', orient='split')

JSON 格式存储数据时,可能会丢失行和列的顺序,可以实现构建一列索引记录数据的顺序。

保存 json 文件的时还可以使用其他一些参数。

  • encoding 设置编码。
  • convert_dates 设置日期格式。
  • dtypeprecise_float 设置数据的精度。
  • . 将数字数据直接解码为 NumPy 数组(numpy=True)。

HTML 文件

HTML是一个纯文本文件,使用超文本标记语言在浏览器呈现网页。HTML 文件的扩展名是 .html.htm 。需要安装 lxml 或者 html5lib 才能处理和解析 HTML 文件。

pip install lxml html5lib

.to_html()保存数据到 html 文件。

df = pd.DataFrame(data).T
df.to_html('data.html')

保存 html 文件的时还可以使用其他一些参数。

  • header 是否保存列名。
  • index 是否保存行标签。
  • classes 分配级联样式表 CSS 类。
  • render_links 指定是否将 URL 转换为 HTML 链接。
  • table_id 将 CSS 分配给id标签table。
  • escape 决定是否将字符<、>和转换&为 HTML 安全字符串。

Excel 文件

to_excel()进行 excel 保存的时候还可以指定对应的 sheet 名。

df = pd.DataFrame(data).T
df.to_excel('data.xlsx', sheet_name='COUNTRIES')

并且还可以指定最开始写入的单元格。

df.to_excel('data-shifted.xlsx', sheet_name='COUNTRIES',startrow=2, startcol=4)

SQL 文件

Pandas IO 工具还可以读写数据库,需要使用 SQLAlchemy 进行操作。并且 Python 有一个内置的 SQLite 驱动程序。

安装 SQLAlchemy。

pip install sqlalchemy

使用 create_engine() 导入并创建数据库引擎。

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://user:password@localhost/database?charset=utf8')

.to_sql()保存数据。

df.to_sql('table', con=engine,if_exists='append',index=0)

具有相同名称和路径的数据库可以使用的操作有:

  • if_exists=‘fail’ 引发ValueError错误。
  • if_exists=‘replace’ 删除表并插入新值。
  • if_exists=‘append’ 将新值插入表中。

Pickle 文件

Pickling 是将 Python 对象转换为字节流的行为。Python pickle 文件是保存 Python 对象的数据和层次结构的二进制文件,通常具有扩展名 .pickle.pkl

.to_pickle()保存数据。

dtypes = {
 'POP': 'float64', 'AREA': 'float64', 'GDP': 'float64','IND_DAY': 'datetime64'}
df = pd.DataFrame(data).T.astype(dtype=dtypes)
df.to_pickle('data.pickle')

使用 read_pickle() 从 pickle 文件中获取数据。

df = pd.read_pickle('data.pickle')
df
        COUNTRY      POP      AREA       GDP       CONT    IND_DAY
CHN       China  1398.72   9596.96  12234.78       Asia 1949-10-01
IND       India  1351.16   3287.26   2575.67       Asia 1947-08-15
USA          US   329.74   9833.52  19485.39  N.America 1776-07-04
IDN   Indonesia   268.07   1910.93   1015.54       Asia 1945-08-17
BRA      Brazil   210.32   8515.77   2055.51  S.America 1822-09-07
PAK    Pakistan   205.71    881.91    302.14       Asia 1947-08-14
NGA     Nigeria   200.96    923.77    375.77     Africa 1960-10-01
BGD  Bangladesh   167.09    147.57    245.63       Asia 1971-03-26
RUS      Russia   146.79  17098.25   1530.75        NaN 1992-06-12
MEX      Mexico   126.58   1964.38   1158.23  N.America 1810-09-16
JPN       Japan   126.22    377.97   4872.42       Asia        NaT
DEU     Germany    83.02    357.11   3693.20     Europe        NaT
FRA      France    67.02    640.68   2582.49     Europe 1789-07-14
GBR          UK    66.44    242.50   2631.23     Europe        NaT
ITA       Italy    60.36    301.34   1943.84     Europe        NaT
ARG   Argentina    44.94   2780.40    637.49  S.America 1816-07-09
DZA     Algeria    43.38   2381.74    167.56     Africa 1962-07-05
CAN      Canada    37.59   9984.67   1647.12  N.America 1867-07-01
AUS   Australia    25.47   7692.02   1408.68    Oceania        NaT
KAZ  Kazakhstan    18.53   2724.90    159.41       Asia 1991-12-16

海量数据的应用

如果文件太大而无法保存或处理,可以采取多种方法来减少所需的磁盘空间的处理方式,例如: 压缩文件、只选择你想要的列、省略不需要的行、强制使用不太精确的数据类型、将数据拆分成块 等方式。

压缩和解压缩文件

常用的文件后缀包括 ‘.gz’、’.bz2’、’.zip’、’.xz’

Pandas 数据保存的时候可以自行推断压缩类型。

import pandas as pd
df = pd.DataFrame(data).T
df.to_csv('data.csv')
df.to_csv('data.csv.zip')

对比一下不同的保存方式。

然后可以使用 read_csv() 读取该文件。

df = pd.read_csv('data.csv.zip', index_col=0,parse_dates=['IND_DAY'])
df
        COUNTRY      POP      AREA       GDP       CONT    IND_DAY
CHN       China  1398.72   9596.96  12234.78       Asia        NaT
IND       India  1351.16   3287.26   2575.67       Asia 1947-08-15
USA          US   329.74   9833.52  19485.39  N.America 1776-07-04
IDN   Indonesia   268.07   1910.93   1015.54       Asia 1945-08-17
BRA      Brazil   210.32   8515.77   2055.51  S.America 1822-09-07
PAK    Pakistan   205.71    881.91    302.14       Asia 1947-08-14
NGA     Nigeria   200.96    923.77    375.77     Africa 1960-10-01
BGD  Bangladesh   167.09    147.57    245.63       Asia 1971-03-26
RUS      Russia   146.79  17098.25   1530.75        NaN 1992-06-12
MEX      Mexico   126.58   1964.38   1158.23  N.America 1810-09-16
JPN       Japan   126.22    377.97   4872.42       Asia        NaT
DEU     Germany    83.02    357.11   3693.20     Europe        NaT
FRA      France    67.02    640.68   2582.49     Europe 1789-07-14
GBR          UK    66.44    242.50   2631.23     Europe        NaT
ITA       Italy    60.36    301.34   1943.84     Europe        NaT
ARG   Argentina    44.94   2780.40    637.49  S.America 1816-07-09
DZA     Algeria    43.38   2381.74    167.56     Africa 1962-07-05
CAN      Canada    37.59   9984.67   1647.12  N.America 1867-07-01
AUS   Australia    25.47   7692.02   1408.68    Oceania        NaT
KAZ  Kazakhstan    18.53   2724.90    159.41       Asia 1991-12-16

可以使用可选参数指定压缩类型,其中可选参数有: ‘infer’、‘gzip’、‘bz2’、‘zip’、‘xz’、None

pickle的文件压缩方法写入和读取的方法。

df = pd.DataFrame(data).T
df.to_pickle('data.pickle.compress', compression='gzip')

df = pd.read_pickle('data.pickle.compress', compression='gzip')

数据列的选取

可以使用 usecols 从加载文件中选择要读取的数据列。

df = pd.read_csv('data.csv', usecols=['COUNTRY', 'AREA'])
df.head(5)
       COUNTRY      AREA
0        China   9596.96
1        India   3287.26
2           US   9833.52
3    Indonesia   1910.93
4       Brazil   8515.77

也可以用使用列索引的方式读取数据。

df = pd.read_csv('data.csv',index_col=0, usecols=[0, 1, 3])
df.head(5)
        COUNTRY      AREA
CHN       China   9596.96
IND       India   3287.26
USA          US   9833.52
IDN   Indonesia   1910.93
BRA      Brazil   8515.77

当数据应用与机器学习和深度学习模型的时候,可能不需要全部的数据集用于计算,仅仅加载需要计算容量的数据即可,因此可以使用选择行数据的方式进行。一般方式有3种:

  • skiprows:在文件开头要跳过的行数,或者如果是类似列表的对象,则要跳过的行的从零开始的索引。
  • skipfooter:文件末尾要跳过的行数。
  • nrows:要读取的行数。

结合 range() 跳过奇数索引的行,保留偶数的行。

df = pd.read_csv('data.csv', index_col=0, skiprows=range(1, 20, 2))

强制使用不太精确的数据类型

这样做的最大好处就是可以节省大量的内存。

df.dtypes
COUNTRY            object
POP               float32
AREA              float32
GDP               float32
CONT               object
IND_DAY    datetime64[ns]
dtype: object

例如带有浮点数的列是 64 位浮点数,这种类型的每个数字 float64 占用 64 位或 8 个字节。如果是列是 32 位浮点数,这种类型的每个数字 float32 占用 32 位或 4 个字节。

表示的内容是一样的,但是内存空间节省了一半。

chunksize 块遍历

chunksize 可以将数据拆分为较小的块并一次处理一个块。

data_chunk = pd.read_csv('data.csv', index_col=0, chunksize=8)

可以结合 for 循环的方式拼接数据汇总要读取的全体数据信息。

for df_chunk in pd.read_csv('data.csv', index_col=0, chunksize=8):
    print(df_chunk, end='\n\n')
    print('memory:', df_chunk.memory_usage().sum(), 'bytes',
          end='\n\n\n')

        COUNTRY      POP     AREA       GDP       CONT     IND_DAY
CHN       China  1398.72  9596.96  12234.78       Asia  1947-10-01
IND       India  1351.16  3287.26   2575.67       Asia  1947-08-15
USA          US   329.74  9833.52  19485.39  N.America  1776-07-04
IDN   Indonesia   268.07  1910.93   1015.54       Asia  1945-08-17
BRA      Brazil   210.32  8515.77   2055.51  S.America  1822-09-07
PAK    Pakistan   205.71   881.91    302.14       Asia  1947-08-14
NGA     Nigeria   200.96   923.77    375.77     Africa  1960-10-01
BGD  Bangladesh   167.09   147.57    245.63       Asia  1971-03-26

memory: 448 bytes


       COUNTRY     POP      AREA      GDP       CONT     IND_DAY
RUS     Russia  146.79  17098.25  1530.75        NaN  1992-06-12
MEX     Mexico  126.58   1964.38  1158.23  N.America  1810-09-16
JPN      Japan  126.22    377.97  4872.42       Asia         NaN
DEU    Germany   83.02    357.11  3693.20     Europe         NaN
FRA     France   67.02    640.68  2582.49     Europe  1789-07-14
GBR         UK   66.44    242.50  2631.23     Europe         NaN
ITA      Italy   60.36    301.34  1943.84     Europe         NaN
ARG  Argentina   44.94   2780.40   637.49  S.America  1816-07-09

memory: 448 bytes


        COUNTRY    POP     AREA      GDP       CONT     IND_DAY
DZA     Algeria  43.38  2381.74   167.56     Africa  1962-07-05
CAN      Canada  37.59  9984.67  1647.12  N.America  1867-07-01
AUS   Australia  25.47  7692.02  1408.68    Oceania         NaN
KAZ  Kazakhstan  18.53  2724.90   159.41       Asia  1991-12-16

memory: 224 bytes

相关推荐

电信宽带办理电话是多少(电信宽带办理联系电话)

电信宽带不一定需要电信手机号码,可以根据自身需要选择,有单独的宽带业务,一般要求预存一定时间的使用费。不过一般包含了宽带、手机号码的融合套餐总体上更优惠,对客户来说更划算。如果有相应需求的话,建议同时...

开机进入ghost启动项(电脑启动进入ghost)

电脑启动的时候进入GHOST界面方法:  1、首先确认电脑装了GHOST软件。  2、重启电脑,注意仔细观察电脑屏幕,会有一个3s或者10s的选择界面。让选择是进入GHOST界面,或者正常启动进入系...

华硕bios修复蓝屏图解(华硕bios修复蓝屏视频教程)

先看下BIOS是否可以识别到硬盘设备,若看不到,硬盘故障的可能性很大。若可以看到硬盘,建议先尝试进行BIOS兼容性设置:1,在BIOS界面,通过方向键进【Secure】菜单,通过方向键选择【Sec...

老电脑怎么装win7系统(老电脑装win7系统可以吗)

6年前的电脑,如果是用的当时最新的CPU的话,应该是第7代或者第6代酷睿等级的。运行windows7和windows10都应该没有压力。从软件的兼容性来说,还是建议安装windows10,因为现在有好...

电脑怎么设置到点自动关机(电脑怎样设置到点关机)

1、首先我们点击电脑屏幕左下角的开始按钮,在所有程序里依次选择附件---系统工具,接着打开任务计划程序。2、我们打开任务计划程序后,在最右边的操作框里选择创建基本任务,然后在创建基本任务对话框的名称一...

2025年笔记本电脑排行榜(20201年笔记本电脑推荐)

2023华为笔记本电脑matebook16系列很好用的。因为这个系列她是有非常好的性价,比的是能够让你有非常轻薄的厚度,并且能够有11.6寸的屏幕,而且还有120赫兹的刷新率作为大学生,您可能需要经常...

powerpoint激活密钥(ppt密钥 激活码2010)

1/4进入文件打开一个PPT文件进入到软件界面,在界面左上方找到文件选项,点击该选项进入到文件页面。2/4点击账户文件页面中,页面左侧找到账户选项,点击该选项,页面右侧会出现相应的操作选择。3/4点击...

水星usb无线网卡驱动下载(水星usb无线网卡驱动下载安装)
  • 水星usb无线网卡驱动下载(水星usb无线网卡驱动下载安装)
  • 水星usb无线网卡驱动下载(水星usb无线网卡驱动下载安装)
  • 水星usb无线网卡驱动下载(水星usb无线网卡驱动下载安装)
  • 水星usb无线网卡驱动下载(水星usb无线网卡驱动下载安装)
qq恢复删除好友官网(qq恢复已删好友)
qq恢复删除好友官网(qq恢复已删好友)

qq恢复官方网站,http://huifu.qq.com/1、什么是QQ恢复系统?QQ恢复系统是腾讯公司提供的一项找回QQ联系人、QQ群的服务,向所有QQ用户免费开放。2、QQ恢复系统能恢复多长时间内删除的好友?普通用户可以申请恢复3个月内...

2025-12-28 16:03 off999

优启通u盘重装win7系统教程(优启通u盘装win7系统教程图解)

系统显示未找到万能驱动的解决方法是:1、重插下usb口1、造成“找不到驱动器设备驱动程序”的原因,可能是usb口出现问题。2、换个usb口可能是单独这个usb口出现问题,可以选择另外的usb口重试wi...

笔记本mac地址在哪看(笔记本电脑mac地址怎么查询)
  • 笔记本mac地址在哪看(笔记本电脑mac地址怎么查询)
  • 笔记本mac地址在哪看(笔记本电脑mac地址怎么查询)
  • 笔记本mac地址在哪看(笔记本电脑mac地址怎么查询)
  • 笔记本mac地址在哪看(笔记本电脑mac地址怎么查询)
wifi加密方式怎么设置(wifi网络加密怎么设置)

若你想将自己的无线网改成加密的,可以按照以下步骤操作:1.打开你的路由器管理界面。一般来说,在浏览器地址栏输入“192.168.1.1”或“192.168.0.1”,然后输入用户名和密码登录就可以打...

sql数据库自学(数据库入门必看——《sql基础教程》)

SQLServer数据库基础知识:1.数据库是由数据组成的,这些数据可以被组织成有序的数据结构,以支持特定的应用程序。2.数据库管理系统(DBMS)是一种软件工具,用于创建、管理和操作数据库。...

无线网连接不可上网怎么回事

可能有几下几方面原因:1、无线路由器网络参数设置错误,无法拨通ISP运营商的局端设备,无法接入互联网;2、宽带线路出现故障,路由器无法拨通ISP运营商的局端设备,无法连通;3、宽带DNS服务器由于某种...

电脑蓝屏重新启动(电脑蓝屏重新启动快捷键)
  • 电脑蓝屏重新启动(电脑蓝屏重新启动快捷键)
  • 电脑蓝屏重新启动(电脑蓝屏重新启动快捷键)
  • 电脑蓝屏重新启动(电脑蓝屏重新启动快捷键)
  • 电脑蓝屏重新启动(电脑蓝屏重新启动快捷键)

取消回复欢迎 发表评论: