我們大致會說到的方法有:
read_sql()
to_sql()
read_clipboard()
from_dict()
to_dict()
to_clipboard()
read_json()
to_json()
read_html()
to_html()
read_table()
read_csv()
to_csv()
read_excel()
to_excel()
read_xml()
to_xml()
read_pickle()
to_pickle()
read_sql()與
to_sql()
我們一般讀取數據都是從數據庫中來讀取的,因此可以在read_sql()方法中填入對應的
sql語句然后來讀取我們想要的數據,
pd.read_sql(sql, con, index_col=none,coerce_float=true, params=none,
parse_dates=none,
columns=none, chunksize=none)
- sql: sql命令字符串
- con: 連接sql數據庫的engine,一般用sqlalchemy或者是pymysql之類的模塊來建立
- index_col:選擇某一列作為index
- coerce_float:將數字形式的字符串直接以float型讀入
- parse_dates: 將某一列日期型字符串傳喚為datatime型數據,可以直接提供需要轉換的列名以默認的日期形式轉換,或者也可以提供字典形式的列名和轉換日期的格式,
pymysql這個模塊來連接數據庫,并且讀取數據庫當中的數據,首先我們導入所需要的模塊,并且建立起與數據庫的連接
import pandas as pdfrom pymysql import *
conn = connect(host='localhost', port=3306, database='database_name',
user='', password='', charset='utf8')
sql命令來讀取數據庫當中的數據,并且用read_sql()方法來讀取數據
sql_cmd = "select * from table_name"df = pd.read_sql(sql_cmd, conn)
df.head()
read_sql()方法當中
parse_dates參數可以對日期格式的數據進行處理,那我們來試一下其作用
sql_cmd_2 = "select * from test_date"df_1 = pd.read_sql(sql_cmd_2, conn)
df_1.head()
0 1 2021-11-11
1 2 2021-10-01
2 3 2021-11-10
rangeindex: 3 entries, 0 to 2
data columns (total 2 columns):
# column non-null count dtype
--- ------ -------------- -----
0 number 3 non-null int64
1 date_columns 3 non-null object
dtypes: int64(1), object(1)
memory usage: 176.0 bytes
date_columns這一列也是被當做是
string類型的數據,要是我們通過
parse_dates參數將日期解析應用與該列
df_2 = pd.read_sql(sql_cmd_2, conn, parse_dates="date_columns")df_2.info()
rangeindex: 3 entries, 0 to 2
data columns (total 2 columns):
# column non-null count dtype
--- ------ -------------- -----
0 number 3 non-null int64
1 date_columns 3 non-null datetime64[ns]
dtypes: datetime64[ns](1), int64(1)
memory usage: 176.0 bytes
to_sql()方法
我們來看一下to_sql()方法,作用是將
dataframe當中的數據存放到數據庫當中,請看下面的示例代碼,我們創建一個基于內存的
sqlite數據庫
from sqlalchemy import create_engineengine = create_engine('sqlite://', echo=false)
df.to_sql('nums', con=engine)
df2.to_sql('nums', con=engine, if_exists='append')
engine.execute("select * from nums").fetchall()
if_exists參數上面填的是
append,意味著添加新數據進去,當然我們也可以將原有的數據替換掉,將
append替換成
replace
df2.to_sql('nums', con=engine, if_exists='replace')engine.execute("select * from nums").fetchall()
from_dict()方法和
to_dict()方法
有時候我們的數據是以字典的形式存儲的,有對應的鍵值對,我們如何根據字典當中的數據來創立dataframe,假設
a_dict = {'學校': '清華大學',
'地理位置': '北京',
'排名': 1
}
json_normalize()方法,代碼如下
df = pd.json_normalize(a_dict)0 清華大學 北京 1
pd.dataframe()方法也是可以的
df = pd.dataframe(json_list, index = [0])0 清華大學 北京 1
from_dict()方法,代碼如下
df = pd.dataframe.from_dict(a_dict,orient='index').t0 清華大學 北京 1
orient參數,用來指定字典當中的鍵是用來做行索引還是列索引,請看下面兩個例子
data = {'col_1': [1, 2, 3, 4],'col_2': ['a', 'b', 'c', 'd']}
orient參數設置為
columns,將當中的鍵當做是列名
df = pd.dataframe.from_dict(data, orient='columns')0 1 a
1 2 b
2 3 c
3 4 d
orient設置為是
index
df = pd.dataframe.from_dict(data, orient='index')col_1 1 2 3 4
col_2 a b c d
to_dict()方法
語法如下:orient參數,一般可以填這幾種形式
一種是默認的dict,代碼如下
df = pd.dataframe({'shape': ['square', 'circle', 'triangle'],'degrees': [360, 360, 180],
'sides': [4, 5, 3]})
df.to_dict(orient='dict')
list,代碼如下
df.to_dict(orient='list')split,代碼如下
df.to_dict(orient='split')records,代碼如下
df.to_dict(orient='records')index,代碼如下
df.to_dict(orient='index')read_json()方法和
to_json()方法
我們經常也會在實際工作與學習當中遇到需要去處理json格式數據的情況,我們用
pandas模塊當中的
read_json()方法來進行處理,我們來看一下該方法中常用到的參數
orient:對應json字符串的格式主要有split: 格式類似于:
{index: [index], columns: [columns], data: [values]}
df = pd.read_json(a, orient='split')
1 1 3
2 2 8
3 3 9
records: 格式類似于:
[{column: value}, ... , {column: value}]
df_1 = pd.read_json(a, orient='records')
0 tom 18
1 amy 20
2 john 17
index: 格式類似于:
{index: {column: value}}
df_1 = pd.read_json(a, orient='index')
index_1 john 20
index_2 tom 30
index_3 jason 50
columns: 格式類似于:
{column: {index: value}}
index變成
columns,就變成
df_1 = pd.read_json(a, orient='columns')name john tom jason
age 20 30 50
values: 數組
df_1 = pd.read_json(v, orient="values")
0 a 1
1 b 2
2 c 3
to_json()方法
將dataframe數據對象輸出成
json字符串,可以使用
to_json()方法來實現,其中
orient參數可以輸出不同格式的字符串,用法和上面的大致相同,這里就不做過多的贅述
read_html()方法和
to_html()方法
有時候我們需要抓取網頁上面的一個表格信息,相比較使用xpath或者是
beautifulsoup,我們可以使用
pandas當中已經封裝好的函數
read_html來快速地進行獲取,例如我們通過它來抓取菜鳥教程python網站上面的一部分內容
url = "https://www.runoob.com/python/python-exceptions.html"dfs = pd.read_html(url, header=none, encoding='utf-8')
list的
dataframe對象
df = dfs[0]df.head()
0 nan nan
1 baseexception 所有異常的基類
2 systemexit 解釋器請求退出
3 keyboardinterrupt 用戶中斷執行(通常是輸入^c)
4 exception 常規錯誤的基類
read_html()方法也支持讀取
html形式的表格,我們先來生成一個類似這樣的表格,通過
to_html()方法
df = pd.dataframe(np.random.randn(3, 3))df.to_html("test_1.html")
html形式的表格長這個樣子
read_html方法讀取該文件,
dfs = pd.read_html("test_1.html")dfs[0]
read_csv()方法和
to_csv()方法
read_csv()方法
read_csv()方法是最常被用到的
pandas讀取數據的方法之一,其中我們經常用到的參數有
- filepath_or_buffer: 數據輸入的路徑,可以是文件的路徑的形式,例如
0 1 2 3 4
1 6 12 7 9
2 11 13 15 18
3 12 10 16 18
- sep: 讀取
csv文件時指定的分隔符,默認為逗號,需要注意的是:“csv文件的分隔符”要和“我們讀取csv文件時指定的分隔符”保持一致
csv文件當中的分隔符從逗號改成了"\t",需要將
sep參數也做相應的設定
pd.read_csv('data.csv', sep='\t')- index_col: 我們在讀取文件之后,可以指定某一列作為
dataframe的索引
num1
1 2 3 4
6 12 7 9
11 13 15 18
12 10 16 18
num1 num2
1 2 3 4
6 12 7 9
11 13 15 18
12 10 16 18
- usecols:如果數據集當中的列很多,而我們并不想要全部的列、而是只要指定的列就可以,就可以使用這個參數
0 1 2
1 6 12
2 11 13
3 12 10
0 1 2 3
1 6 12 7
2 11 13 15
3 12 10 16
pd.read_csv('girl.csv', usecols=lambda x: len(x) > 4)
- prefix: 當導入的數據沒有header的時候,可以用來給列名添加前綴
0 num1 num2 num3 num4
1 1 2 3 4
2 6 12 7 9
3 11 13 15 18
4 12 10 16 18
header設為none,
pandas則會自動生成表頭0, 1, 2, 3..., 然后我們設置
prefix參數為表頭添加前綴
df = pd.read_csv("data.csv", prefix="test_", header = none)0 num1 num2 num3 num4
1 1 2 3 4
2 6 12 7 9
3 11 13 15 18
4 12 10 16 18
- skiprows: 過濾掉哪些行,參數當中填行的索引
0 11 13 15 18
1 12 10 16 18
- nrows: 該參數設置一次性讀入的文件行數,對于讀取大文件時非常有用,比如 16g 內存的pc無法容納幾百g的大文件
0 1 2 3 4
1 6 12 7 9
to_csv()方法
該方法主要是用于將dataframe寫入
csv文件當中,示例代碼如下
df.to_csv("文件名.csv", index = false)zip文件的格式,代碼如下
df = pd.read_csv("data.csv")compression_opts = dict(method='zip',
archive_name='output.csv')
df.to_csv('output.zip', index=false,
compression=compression_opts)
read_excel()方法和
to_excel()方法
read_excel()方法
要是我們的數據是存放在excel當中就可以使用
read_excel()方法,該方法中的參數和上面提到的
read_csv()方法相差不多,這里就不做過多的贅述,我們直接來看代碼
df = pd.read_excel("test.xlsx")- dtype: 該參數能夠對指定某一列的數據類型加以設定
0 name1 1.0
1 name2 2.0
2 name3 3.0
3 name4 4.0
- sheet_name: 對于讀取
excel當中的哪一個
sheet當中的數據加以設定
0 name1 10
1 name2 10
2 name3 20
3 name4 30
sheet當中的數據也是可以的,最后返回的數據是以
dict形式返回的
df = pd.read_excel("test.xlsx", sheet_name=["sheet1", "sheet3"])0 name1 1
1 name2 2
2 name3 3
3 name4 4, 'sheet3': name value
0 name1 10
1 name2 10
2 name3 20
3 name4 30}
sheet1的數據,可以這么來做
df1.get("sheet1")0 name1 1
1 name2 2
2 name3 3
3 name4 4
to_excel()方法
將dataframe對象寫入
excel表格,除此之外還有
excelwriter()方法也有著異曲同工的作用,代碼如下
df1 = pd.dataframe([['a', 'b'], ['c', 'd']],index=['row 1', 'row 2'],
columns=['col 1', 'col 2'])
df1.to_excel("output.xlsx")
sheet的名稱
df1.to_excel("output.xlsx", sheet_name='sheet_name_1_1_1')dataframe數據集輸出到一個
excel當中的不同的
sheet當中
df2 = df1.copy()with pd.excelwriter('output.xlsx') as writer:
df1.to_excel(writer, sheet_name='sheet_name_1_1_1')
df2.to_excel(writer, sheet_name='sheet_name_2_2_2')
sheet的基礎之上,再添加一個
sheet
df3 = df1.copy()with pd.excelwriter('output.xlsx', mode="a", engine="openpyxl") as writer:
df3.to_excel(writer, sheet_name='sheet_name_3_3_3')
excel文件并且進行壓縮包處理
with zipfile.zipfile("output_excel.zip", "w") as zf:with zf.open("output_excel.xlsx", "w") as buffer:
with pd.excelwriter(buffer) as writer:
df1.to_excel(writer)
df = pd.dataframe(
[
[date(2019, 1, 10), date(2021, 11, 24)],
[datetime(2019, 1, 10, 23, 33, 4), datetime(2021, 10, 20, 13, 5, 13)],
],
index=["date", "datetime"],
columns=["x", "y"],
)
with pd.excelwriter(
"output_excel_date.xlsx",
date_format="yyyy-mm-dd",
datetime_format="yyyy-mm-dd hh:mm:ss"
) as writer:
df.to_excel(writer)
read_table()方法
對于txt文件,既可以用
read_csv()方法來讀取,也可以用
read_table()方法來讀取,其中的參數和read_csv()當中的參數大致相同,這里也就不做過多的贅述
df = pd.read_table("test.txt", names = ["col1", "col2"], sep=' ')0 1 2
1 3 4
2 5 6
3 7 8
4 9 10
5 11 12
sep參數上面需要設置成空格
read_pickle()方法和to_pickle()方法
python當中的
pickle模塊實現了對一個
python對象結構的二進制序列和反序列化,序列化過程是將文本信息轉變為二進制數據流,同時保存數據類型。例如數據處理過程中,突然有事兒要離開,可以直接將數據序列化到本地,這時候處理中的數據是什么類型,保存到本地也是同樣的類型,反序列化之后同樣也是該數據類型,而不是從頭開始處理
to_pickle()方法
我們先將dataframe數據集生成
pickle文件,對數據進行永久儲存,代碼如下
df1.to_pickle("test.pkl")read_pickle()方法
代碼如下read_xml()方法和
to_xml()方法
xml指的是可擴展標記語言,和json類似也是用來存儲和傳輸數據的,還可以用作配置文件xml和html之間的差異
xml和html為不同的目的而設計的- xml被設計用來傳輸和存儲數據,其重點是數據的內容
- html被設計用來顯示數據,其焦點是數據的外觀
- xml不會替代html,是對html的補充
to_xml()方法生成xml數據
df = pd.dataframe({'shape': ['square', 'circle', 'triangle'],'degrees': [360, 360, 180],
'sides': [4, np.nan, 3]})
df.to_xml("test.xml")
pandas中的
read_xml()方法來讀取數據
df = pd.read_xml("test.xml")0 square 360 4.0
1 circle 360 nan
2 triangle 180 3.0
read_clipboard()方法
有時候數據獲取不太方便,我們可以通過復制的方式,通過pandas當中的
read_clipboard()方法來讀取復制成功的數據,例如我們選中一部分數據,然后復制,運行下面的代碼
df_1 = pd.read_clipboard()0 1 2 3 4
1 6 12 7 9
2 11 13 15 18
3 12 10 16 18
to_clipboard()方法
有復制就會有粘貼,我們可以將dataframe數據集輸出至剪貼板中,粘貼到例如
excel表格中
df.to_clipboard()