팬더가 소스 데이터를 읽고 쓰는 방법

함께 만들고 함께 성장하기 위해 함께 노력하십시오! "너겟 데일리 뉴플랜·8월 업데이트 챌린지" 참여 10일차입니다. 클릭하시면 이벤트 내용을 보실 수 있습니다.

머리말

판다에 관해서는 모든 데이터 분석가가 판다에 대해 잘 알고 있다고 생각합니다. 일상적인 분석 작업에서 데이터를 읽고 써야 하는 것은 불가피합니다. 데이터 소스는 csv 파일, Excel 콘텐츠, 관계형 데이터베이스 등과 같이 다양한 경우가 많습니다.

이러한 데이터 소스의 읽기 및 쓰기를 지원하기 위해 pandas는 이를 달성하기 위한 관련 방법을 가지고 있습니다. 다음은 다양한 유형의 데이터를 읽고 쓰는 방법에 대한 요약입니다.

csv 및 Excel 읽기 및 쓰기

csv 파일 읽기

먼저 csv 파일에 대해 알아보겠습니다. csv 내용을 읽는 함수는 read_csv. 전달할 수 있는 매개변수가 많이 있습니다. 더 많이 사용되는 매개변수를 살펴보겠습니다.

pandas.read_csv(filepath_or_buffer, header="infer", index_col=None, usecols=None, nrows=None)
复制代码
  • filepath_or_buffer: csv 파일 경로/URL 주소
  • header: int/int의 목록, 기본적으로 헤더가 있는지 여부를 자동으로 유추합니다. header=3과 같이 int를 채울 때 세 번째 행 헤더를 설정합니다.
  • index_col: int/str. index_col=4는 4번째 열을 인덱스 열로 설정하는 것을 의미합니다.
  • usecols: 목록 유사 또는 호출 가능, 선택적 매개변수. 열의 선택된 부분의 데이터를 나타냅니다.
  • nrows: int, 선택적 매개변수. 읽은 줄 수입니다. 대용량 파일을 읽을 때 모든 라인 데이터를 로드하지 않도록 설정할 수 있습니다.

예를 들어:

import pandas as pd
df = pd.read_csv('/data/a.csv')
复制代码

두 번째 행의 헤더를 설정하고 5000개 행만 읽습니다.

import pandas as pd
df = pd.read_csv('/data/a.csv', header=2, nrows=5000)
复制代码

csv 파일 쓰기

기능은 to_csv, 주요 매개변수는 다음과 같습니다.

df.to_csv(path_or_buf, header=True, index=True)
复制代码
  • path_or_buff: 파일을 쓸 경로
  • header: 헤더가 있든 없든 기본값은 True입니다.
  • index: 인덱스 쓰기 여부, 기본값은 True

예를 들어:

import pandas as pd
df = pd.read_csv('/data/a.csv')
df['col1'] = 1
# 写入到b文件中
df.to_csv('/data/b.csv', index=False)
复制代码

엑셀 파일 읽기

기능은 read_excel, 주요 매개변수는 다음과 같습니다.

pandas.read_excel(io, sheet_name=0,header=0,index_col=None)
复制代码
  • io: 파일 경로 또는 URL 주소
  • sheet_name: str, int, list, 기본값은 0입니다. 기본적으로 첫 번째 시트를 읽는다는 것을 나타내고, str은 시트 이름의 내용이 로드되었음을 나타내고, list는 목록의 시트가 로드되었음을 나타냅니다.
  • 헤더: int, int 목록, 기본값은 0
  • index_col: int, int 목록, 기본값 없음. 인덱스 필드

예시:

import pandas as pd
# 读取a.xlsx表sheet_name是‘测试数据’的数据
df = pd.read_excel('data/a.xlsx', sheet_name='测试数据')
复制代码

엑셀 파일 쓰기

函数是to_excel,主要参数有:

df.to_excel(excel_writer, sheet_name='Sheet1', index=True)
复制代码
  • excel_writer:Str或Excel Writer对象
  • sheet_name:str, sheet名称
  • index: bool,默认True。是否保存index

小例子:

import pandas as pd

df = pd.read_excel('data/a.xlsx', sheet_name='测试数据')
with pd.ExcelWriter('/data/b.xlsx') as writer:
    df.to_excel(writer, sheet_name='测试数据',index=False)
复制代码

另外像json文件读写都与excel、csv相似,大家可参考官方文档。

数据库读写

数据库也是我们最常遇到的读写场景,我们这里主要以MySQL为例。

MySQL的读取

函数read_sql, 常用参数:

pandas.read_sql(sql, con, index_col=None)
复制代码
  • sql: sql查询语句
  • con: 数据库连接对象,主要是sqlalchemy、sqlite3连接
  • index_col: index字段的设置

mysql的连接,我们通常用sqlalchemy来作为连接对象,请看下面示例:

from sqlalchemy import create_engine
import  pandas as pd

# 填写mysql的连接url
con = "mysql+pymysql://{user}:{pwd}@{host}:{port}/{db}?charset=utf8"
engine = create_engine(con, connect_args={'connect_timeout': 20})

sql = "select id, name from users where id"
df = pd.read_sql(sql, con)
复制代码

MySQL的写入

函数to_sql, 常用参数:

DataFrame.to_sql(name, con, if_exists='fail', index=True, index_label=None, method=None)
复制代码
  • name: MySQL的表名
  • con: 连接对象
  • if_exists: fail/replace/append, 默认fail。
  • index:默认True, 是否保存index
  • index_label: 索引标签
  • method: 控制sql插入的自定义方法

示例:

from sqlalchemy import create_engine
import  pandas as pd

# 填写mysql的连接url
con = "mysql+pymysql://{user}:{pwd}@{host}:{port}/{db}?charset=utf8"
engine = create_engine(con, connect_args={'connect_timeout': 20})

sql = "select id, name from users where id"
df = pd.read_sql(sql, con)

# 数据写入到a表
df.to_sql(sql, con=con, if_exists="append", index=False,index_label=False)
复制代码

需要注意的是:如果往一个表添加数据,参数if_exists="append"即可。如果设置为if_exists="replace"将会抹去表的数据,再往表里插入数据。

MySQL数据的更新问题

因实际工作中我们经常会有更新数据的场景。to_sql最基本的方法无法达到我们的预期,我们需要用别的方法去实现。

  • 第一个方法就是自定义to_sql的method方法,具体操作就不细讲了。

  • 第二个方法就是结合pandas结合MySQL操作,分步完成数据更新。 这里提供一个思路:

  1. 建立MySQL临时表,将要更新的数据用pandas插入到临时表中
  2. sql语句更新目标表的数据
  3. 删除临时表

示例代码如下:

import pandas as pd
from sqlalchemy import create_engine

# 填写mysql的连接url
con = "mysql+pymysql://{user}:{pwd}@{host}:{port}/{db}?charset=utf8"
engine = create_engine(con, connect_args={'connect_timeout': 20})

sql = "select * from a where status=0"
df = pd.read_sql(sql, con=engine)
df['status'] = 1

# 创建临时表
sql = "create table tmp_data (xxx)"
...

# 更新目标表
update_sql = """
UPDATE table_to_update AS f
     set m3 = t.m3
     from
        temp_table AS t
     where
        f.id=t.id
"""
...

# 删除临时表
del_sql = "drop table temp_table"
...
复制代码

小结

本文主要介绍了pandas读写常用数据源的方法,其他数据源我们也可通过官方文档来查阅使用方法。

추천

출처juejin.im/post/7136067514705903653