如何用Pandas處理文本數據?

2021-03-02 Datawhale

↑↑↑關注後"星標"Datawhale

每日乾貨 & 每月組隊學習,不錯過

作者:耿遠昊,Datawhale成員,華東師範大學

文本數據是指不能參與算術運算的任何字符,也稱為字符型數據。如英文字母、漢字、不作為數值使用的數字(以單引號開頭)和其他可輸入的字符。

文本數據具有數據維度高、數據量大且語義複雜等特點,是一種較為複雜的數據類型。今天,我們就來一起看看如何使用Pandas對文本數據進行數據處理。

本文目錄

    1. string類型的性質

        1.1. string與object的區別

        1.2. string類型的轉換

    2. 拆分與拼接

        2.1. str.split方法

        2.2. str.cat方法

    3. 替換

        3.1. str.replace的常見用法

        3.2. 子組與函數替換

        3.3. 關於str.replace的注意事項

    4. 字串匹配與提取

        4.1. str.extract方法

        4.2. str.extractall方法

        4.3. str.contains和str.match

    5. 常用字符串方法

        5.1. 過濾型方法

        5.2. isnumeric方法

    6. 問題及練習

        6.1. 問題

        6.2. 練習

一、string類型的性質
1. 1 string與object的區別string類型和object不同之處有三點:① 字符存取方法(string accessor methods,如str.count)會返回相應數據的Nullable類型,而object會隨缺失值的存在而改變返回類型;② 某些Series方法不能在string上使用,例如:Series.str.decode(),因為存儲的是字符串而不是字節;③ string類型在缺失值存儲或運算時,類型會廣播為pd.NA,而不是浮點型np.nan其餘全部內容在當前版本下完全一致,但迎合Pandas的發展模式,我們仍然全部用string來操作字符串。1.2 string類型的轉換

首先,導入需要使用的包

import pandas as pdimport numpy as np

如果將一個其他類型的容器直接轉換string類型可能會出錯:
#pd.Series([1,'1.']).astype('string') #pd.Series([1,2]).astype('string') #pd.Series([True,False]).astype('string') 

當下正確的方法是分兩部轉換,先轉為str型object,在轉為string類型:
pd.Series([1,'1.']).astype('str').astype('string')

0 1
1 1
dtype: string

pd.Series([1,2]).astype('str').astype('string')

0 1
1 2
dtype: string

pd.Series([True,False]).astype('str').astype('string')

0 True
1 False
dtype: string

二、拆分與拼接2.1 str.split方法(a)分割符與str的位置元素選取
s = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'], dtype="string")s

0 a_b_c
1 c_d_e
2 <NA>
3 f_g_h
dtype: string

根據某一個元素分割,默認為空格

0 [a, b, c]
1 [c, d, e]
2 <NA>
3 [f, g, h]
dtype: object

這裡需要注意split後的類型是object,因為現在Series中的元素已經不是string,而包含了list,且string類型只能含有字符串。對於str方法可以進行元素的選擇,如果該單元格元素是列表,那麼str[i]表示取出第i個元素,如果是單個元素,則先把元素轉為列表在取出。

0 b
1 d
2 <NA>
3 g
dtype: object

pd.Series(['a_b_c', ['a','b','c']], dtype="object").str[1] #第一個元素先轉為['a','_','b','_','c']

0 _
1 b
dtype: object

(b)其他參數expand參數控制了是否將列拆開,n參數代表最多分割多少次
s.str.split('_',expand=True)

0 [a, b_c]
1 [c, d_e]
2 <NA>
3 [f, g_h]
dtype: object

s.str.split('_',expand=True,n=1)

2.2 str.cat方法

(a)不同對象的拼接模式cat方法對於不同對象的作用結果並不相同,其中的對象包括:單列、雙列、多列① 對於單個Series而言,就是指所有的元素進行字符合併為一個字符串
s = pd.Series(['ab',None,'d'],dtype='string')s

0 ab
1 <NA>
2 d
dtype: string

'abd'

其中可選sep分隔符參數,和缺失值替代字符na_rep參數

'ab,d'

s.str.cat(sep=',',na_rep='*')

'ab,*,d'

② 對於兩個Series合併而言,是對應索引的元素進行合併
s2 = pd.Series(['24',None,None],dtype='string')s2

0 24
1 <NA>
2 <NA>
dtype: string

0 ab24
1 <NA>
2 <NA>
dtype: string

同樣也有相應參數,需要注意的是兩個缺失值會被同時替換
s.str.cat(s2,sep=',',na_rep='*')

0 ab,24
1 *,*
2 d,*
dtype: string

③ 多列拼接可以分為表的拼接和多Series拼接

s.str.cat(pd.DataFrame({0:['1','3','5'],1:['5','b',None]},dtype='string'),na_rep='*')

0 ab15
1 *3b
2 d5*
dtype: string

0 abab0abab
1 <NA>
2 dd0dd
dtype: string

(b)cat中的索引對齊當前版本中,如果兩邊合併的索引不相同且未指定join參數,默認為左連接,設置join='left'
s2 = pd.Series(list('abc'),index=[1,2,3],dtype='string')s2

1 a
2 b
3 c
dtype: string

0 ab*
1 *a
2 db
dtype: string

三、替換廣義上的替換,就是指str.replace函數的應用,fillna是針對缺失值的替換,上一章已經提及。提到替換,就不可避免地接觸到正則表達式,這裡默認讀者已掌握常見正則表達式知識點,若對其還不了解的,可以通過這份資料來熟悉3.1 str.replace的常見用法
s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca','', np.nan, 'CABA', 'dog', 'cat'],dtype="string")s

0 A
1 B
2 C
3 Aaba
4 Baca
5
6 <NA>
7 CABA
8 dog
9 cat
dtype: string

第一個值寫r開頭的正則表達式,後一個寫替換的字符串
s.str.replace(r'^[AB]','***')

0 ***
1 ***
2 C
3 ***aba
4 ***aca
5
6 <NA>
7 CABA
8 dog
9 cat
dtype: string

3.2 子組與函數替換通過正整數調用子組(0返回字符本身,從1開始才是子組)
s.str.replace(r'([ABC])(\w+)',lambda x:x.group(2)[1:]+'*')

0 A
1 B
2 C
3 ba*
4 ca*
5
6 <NA>
7 BA*
8 dog
9 cat
dtype: string

利用?P<....>表達式可以對子組命名調用
s.str.replace(r'(?P<one>[ABC])(?P<two>\w+)',lambda x:x.group('two')[1:]+'*')

0 A
1 B
2 C
3 ba*
4 ca*
5
6 <NA>
7 BA*
8 dog
9 cat
dtype: string

3.3 關於str.replace的注意事項首先,要明確str.replace和replace並不是一個東西:str.replace針對的是object類型或string類型,默認是以正則表達式為操作,目前暫時不支持DataFrame上使用;replace針對的是任意類型的序列或數據框,如果要以正則表達式替換,需要設置regex=True,該方法通過字典可支持多列替換。但現在由於string類型的初步引入,用法上出現了一些問題,這些issue有望在以後的版本中修復。(a)str.replace賦值參數不得為pd.NA這聽上去非常不合理,例如對滿足某些正則條件的字符串替換為缺失值,直接更改為缺失值在當下版本就會報錯
#pd.Series(['A','B'],dtype='string').str.replace(r'[A]',pd.NA) #pd.Series(['A','B'],dtype='O').str.replace(r'[A]',pd.NA) 

此時,可以先轉為object類型再轉換回來,曲線救國:

pd.Series(['A','B'],dtype='string').astype('O').replace(r'[A]',pd.NA,regex=True).astype('string')

0 <NA>
1 B
dtype: string

至於為什麼不用replace函數的regex替換(但string類型replace的非正則替換是可以的),原因在下面一條(b)對於string類型Series在使用replace函數時不能使用正則表達式替換,該bug現在還未修復
pd.Series(['A','B'],dtype='string').replace(r'[A]','C',regex=True)

0 A
1 B
dtype: string

pd.Series(['A','B'],dtype='O').replace(r'[A]','C',regex=True)

0 C
1 B
dtype: object

(c)string類型序列如果存在缺失值,不能使用replace替換
#pd.Series(['A',np.nan],dtype='string').replace('A','B') 

pd.Series(['A',np.nan],dtype='string').str.replace('A','B')

0 B
1 <NA>
dtype: string

綜上,概況的說,除非需要賦值元素為缺失值(轉為object再轉回來),否則請使用str.replace方法四、子串匹配與提取4.1 str.extract方法(a)常見用法
pd.Series(['10-87', '10-88', '10-89'],dtype="string").str.extract(r'([\d]{2})-([\d]{2})')

使用子組名作為列名

pd.Series(['10-87', '10-88', '-89'],dtype="string").str.extract(r'(?P<name_1>[\d]{2})-(?P<name_2>[\d]{2})')

利用?正則標記選擇部分提取

pd.Series(['10-87', '10-88', '-89'],dtype="string").str.extract(r'(?P<name_1>[\d]{2})?-(?P<name_2>[\d]{2})')

pd.Series(['10-87', '10-88', '10-'],dtype="string").str.extract(r'(?P<name_1>[\d]{2})-(?P<name_2>[\d]{2})?')

(b)expand參數(默認為True)

對於一個子組的Series,如果expand設置為False,則返回Series,若大於一個子組,則expand參數無效,全部返回DataFrame。對於一個子組的Index,如果expand設置為False,則返回提取後的Index,若大於一個子組且expand為False,報錯。
s = pd.Series(["a1", "b2", "c3"], ["A11", "B22", "C33"], dtype="string")s.index

Index(['A11', 'B22', 'C33'], dtype='object')

s.str.extract(r'([\w])',expand=False)

A11 a
B22 b
C33 c
dtype: string

s.index.str.extract(r'([\w])')

s.index.str.extract(r'([\w])',expand=False)

Index(['A', 'B', 'C'], dtype='object')

s.index.str.extract(r'([\w])([\d])')

#s.index.str.extract(r'([\w])([\d])',expand=False) 

4.2 str.extractall方法與extract只匹配第一個符合條件的表達式不同,extractall會找出所有符合條件的字符串,並建立多級索引(即使只找到一個)
s = pd.Series(["a1a2", "b1", "c1"], index=["A", "B", "C"],dtype="string")two_groups = '(?P<letter>[a-z])(?P<digit>[0-9])'s.str.extract(two_groups, expand=True)

s.str.extractall(two_groups)

s['A']='a1's.str.extractall(two_groups)

如果想查看第i層匹配,可使用xs方法

s = pd.Series(["a1a2", "b1b2", "c1c2"], index=["A", "B", "C"],dtype="string")s.str.extractall(two_groups).xs(1,level='match')

4.3 str.contains和str.match前者的作用為檢測是否包含某種正則模式
pd.Series(['1', None, '3a', '3b', '03c'], dtype="string").str.contains(r'[0-9][a-z]')

0 False
1 <NA>
2 True
3 True
4 True
dtype: boolean

可選參數為na
pd.Series(['1', None, '3a', '3b', '03c'], dtype="string").str.contains('a', na=False)

0 False
1 False
2 True
3 False
4 False
dtype: boolean

str.match與其區別在於,match依賴於python的re.match,檢測內容為是否從頭開始包含該正則模式
pd.Series(['1', None, '3a_', '3b', '03c'], dtype="string").str.match(r'[0-9][a-z]',na=False)

0 False
1 False
2 True
3 True
4 False
dtype: boolean

pd.Series(['1', None, '_3a', '3b', '03c'], dtype="string").str.match(r'[0-9][a-z]',na=False)

0 False
1 False
2 False
3 True
4 False
dtype: boolean

五、常用字符串方法5.1 過濾型方法(a)str.strip常用於過濾空格
pd.Series(list('abc'),index=[' space1  ','space2  ','  space3'],dtype="string").index.str.strip()

Index(['space1', 'space2', 'space3'], dtype='object')

(b)str.lower和str.upper
pd.Series('A',dtype="string").str.lower()

0 a
dtype: string

pd.Series('a',dtype="string").str.upper()

0 A
dtype: string

(c)str.swapcase和str.capitalize分別表示交換字母大小寫和大寫首字母
pd.Series('abCD',dtype="string").str.swapcase()

0 ABcd
dtype: string

pd.Series('abCD',dtype="string").str.capitalize()

0 Abcd
dtype: string

5.2 isnumeric方法檢查每一位是否都是數字,請問如何判斷是否是數值?(問題二)
pd.Series(['1.2','1','-0.3','a',np.nan],dtype="string").str.isnumeric()

0 False
1 True
2 False
3 False
4 <NA>
dtype: boolean

六、問題與練習6.1 問題【問題一】 str對象方法和df/Series對象方法有什麼區別?

【問題二】 給出一列string類型,如何判斷單元格是否是數值型數據?

【問題三】 rsplit方法的作用是什麼?它在什麼場合下適用?

【問題四】 在本章的第二到第四節分別介紹了字符串類型的5類操作,請思考它們各自應用於什麼場景?

6.2 練習【練習一】 現有一份關於字符串的數據集,請解決以下問題:(a)現對字符串編碼存儲人員信息(在編號後添加ID列),使用如下格式:「×××(名字):×國人,性別×,生於×年×月×日」
> ex1_ori = pd.read_csv('data/String_data_one.csv',index_col='人員編號')> ex1_ori.head()  姓名  國籍  性別  出生年  出生月  出生日人員編號            1  aesfd  2  男  1942  8  102  fasefa  5  女  1985  10  43  aeagd  4  女  1946  10  154  aef  4  男  1999  5  135  eaf  1  女  2010  6  24
> ex1 = ex1_ori.copy()> ex1['冒號'] = ':'> ex1['逗號'] = ','> ex1['國人'] = '國人'> ex1['性別2'] = '性別'> ex1['生於'] = '生於'> ex1['年'] = '年'> ex1['月'] = '月'> ex1['日'] = '日'> ID = ex1['姓名'].str.cat([ex1['冒號'], ex1['國籍'].astype('str'), ex1['國人'], ex1['逗號'], ex1['性別2'], ex1['性別'], ex1['逗號'], ex1['生於'], ex1['出生年'].astype('str'), ex1['年'], ex1['出生月'].astype('str'), ex1['月'], ex1['出生日'].astype('str'), ex1['日'] ])> ex1_ori['ID'] = ID> ex1_ori 姓名 國籍 性別 出生年 出生月 出生日 ID人員編號 1 aesfd 2 男 1942 8 10 aesfd:2國人,性別男,生於1942年8月10日2 fasefa 5 女 1985 10 4 fasefa:5國人,性別女,生於1985年10月4日3 aeagd 4 女 1946 10 15 aeagd:4國人,性別女,生於1946年10月15日4 aef 4 男 1999 5 13 aef:4國人,性別男,生於1999年5月13日5  eaf  1  女  2010  6  24  eaf:1國人,性別女,生於2010年6月24日

(b)將(a)中的人員生日信息部分修改為用中文表示(如一九七四年十月二十三日),其餘返回格式不變。

(c)將(b)中的ID列結果拆分為原列表相應的5列,並使用equals檢驗是否一致。
> dic_year = {i[0]:i[1] for i in zip(list('零一二三四五六七八九'),list('0123456789'))}> dic_two = {i[0]:i[1] for i in zip(list('十一二三四五六七八九'),list('0123456789'))}> dic_one = {'十':'1','二十':'2','三十':'3',None:''}> df_res = df_new['ID'].str.extract(r'(?P<姓名>[a-zA-Z]+):(?P<國籍>[\d])國人,性別(?P<性別>[\w]),生於(?P<出生年>[\w]{4})年(?P<出生月>[\w]+)月(?P<出生日>[\w]+)日')> df_res['出生年'] = df_res['出生年'].str.replace(r'(\w)+',lambda x:''.join([dic_year[x.group(0)[i]] for i in range(4)]))> df_res['出生月'] = df_res['出生月'].str.replace(r'(?P<one>\w?十)?(?P<two>[\w])',lambda x:dic_one[x.group('one')]+dic_two[x.group('two')]).str.replace(r'0','10')> df_res['出生日'] = df_res['出生日'].str.replace(r'(?P<one>\w?十)?(?P<two>[\w])',lambda x:dic_one[x.group('one')]+dic_two[x.group('two')]).str.replace(r'^0','10')> df_res.head()  姓名  國籍  性別  出生年  出生月  出生日人員編號            1  aesfd  2  男  1942  8  102  fasefa  5  女  1985  10  43  aeagd  4  女  1946  10  154  aef  4  男  1999  5  135  eaf  1  女  2010  6  24

【練習二】 現有一份半虛擬的數據集,第一列包含了新型冠狀病毒的一些新聞標題,請解決以下問題:

(a)選出所有關於北京市和上海市新聞標題的所在行。

(b)求col2的均值。
ex2.col2.str.rstrip('-`').str.lstrip('/').astype(float).mean()

-0.984

(c)求col3的均值。
ex2.columns = ex2.columns.str.strip(' ')
def is_number(x): try: float(x) return True except (SyntaxError, ValueError) as e: return Falseex2[~ex2.col3.map(is_number)]

 ex2.col3.str.replace(r'[`\\{]', '').astype(float).mean()

24.707484999999988

本文電子版 後臺回復 文本數 獲取

「感謝你的在看,點讚,分享三

相關焦點

  • Pandas對文本數據處理
    在處理數據的時候,對數值型的數據處理還是比較方便的,但是有時候數值型數據出現問題後就會比較頭痛了,因為文本數據的排列組合可是有很多很多的,今天我們就學習一下如何對文本數據進行處理,這樣我們接下來在工作中遇到了這些情況就可以少掉一下頭髮啦。
  • 如何用pandas對excel中的文本數據進行操作
    excel進行數據的操作最便捷的庫是pandas,但是如何使用pandas對excel中的文本進行清洗,這是一個很技巧性的工作。
  • Python數據分析之pandas數據讀寫
    你首先會學會文本文件的讀寫,隨後再逐步過渡到更加複雜的二進位文件。最後我們會講解SQL和NoSQL常用資料庫的連接方法,我們用幾個例子來說明如何直接把DataFrame中的數據存儲到資料庫中。同時,我們還會介紹如何從資料庫讀取數據,存儲為DataFrame對象,並對其進行檢索。
  • 使用Pandas進行數據處理
    引言我們將深入講解pandas庫在數據處理階段的功能數據處理又可以細分為三個階段,我們將通過例子詳細講解各個階段都會涉及哪些操作,以及如何充分利用pandas庫提供的函數來完成這些操作。數據處理的三個階段為:數據準備、數據轉換和數據聚合。數據準備開始處理數據工作之前,需要先行準備好數據,把數據組裝成便於用pandas庫的各種工具處理的數據結構。
  • 乾貨 :如何用Pandas處理文本數據?
    文本數據是指不能參與算術運算的任何字符,也稱為字符型數據。文本數據具有數據維度高、數據量大且語義複雜等特點,是一種較為複雜的數據類型。今天,我們就來一起看看如何使用Pandas對文本數據進行數據處理。本文目錄    1. string類型的性質        1.1. string與object的區別        1.2. string類型的轉換    2.
  • 用pandas處理時間格式數據
    本文2023字,預計閱讀需10分鐘;我們在處理時間相關的數據時有很多庫可以用,最常用的還是內置的datetime、time這兩個。
  • 【Python基礎】如何用Pandas處理文本數據?
    文本數據是指不能參與算術運算的任何字符,也稱為字符型數據。如英文字母、漢字、不作為數值使用的數字(以單引號開頭)和其他可輸入的字符。文本數據具有數據維度高、數據量大且語義複雜等特點,是一種較為複雜的數據類型。今天,我們就來一起看看如何使用Pandas對文本數據進行數據處理。
  • pandas | 使用pandas進行數據處理——DataFrame篇
    今天是pandas數據處理專題的第二篇文章,我們一起來聊聊pandas當中最重要的數據結構——DataFrame。上一篇文章當中我們介紹了Series的用法,也提到了Series相當於一個一維的數組,只是pandas為我們封裝了許多方便好用的api。而DataFrame可以簡單了理解成Series構成的dict,這樣就將數據拼接成了二維的表格。
  • pandas讀取數據(1)
    將表格型數據讀取為DataFrame是pandas的重要特性,下表總結了實現該功能的部分函數。函數描述read_csv讀取csv文件,逗號為默認的分隔符read_table讀取table文件,也就是txt文件,制表符('\t')為默認分隔符read_clipboardread_table的剪貼板版本,在將表格從Web頁面轉換成數據時有用read_excel讀取XLS或XLSX文件read_hdf讀取pandas存儲的HDF5
  • 《pandas數據讀取》
    ,需要使用不同的函數讀取,pandas內置了10餘種數據源讀取函數和對應的數據寫入函數,常見的數據源有3種,分別是資料庫數據,文本文件(包含一般文本文件和CSV文件)和Excel文件,掌握這三種數據源讀取方法,便能夠完成80%左右的數據讀取工作。
  • Python數據處理庫pandas入門教程
    關於如何獲取pandas請參閱官網上的說明:pandas Installation。通常情況下,我們可以通過pip來執行安裝:目前(2018年2月)pandas的最新版本是v0.22.0(發布時間:2017年12月29日)。我已經將本文的源碼和測試數據放到Github上: pandas_tutorial ,讀者可以前往獲取。
  • 關於Pandas數據處理你不知道的技巧!
    旗下高端量化雲平臺當我們參加一些比賽時,我們可能要花費大量時間來處理數據。本文將由淺到深,為大家講解關於Pandas在數據清理和處理的一些技巧!,因為它不像Boston房價數據(Kaggle最經典的題目)集那樣處理得很好。
  • 如何用Pandas對Excel中的文本數據進行操作
    Pandas,但是如何使用Pandas對Excel中的文本進行清洗,這是一個很技巧性的工作。之前常見的思路是操作結果保存到新的Excel文件中,這會讓代碼可讀性和清洗速度大大降低,這很不Pythonic,所以今天分享Pandas的文本數據處理技巧。Pandas中有Series和DataFrame兩種數據結構,Series是一種數組,DataFrame是一種表(每一行數據是一條記錄,每一列是一個變量)。
  • 127、使用pandas讀取文本文件
    pandas提供了一些用於將表格型數據讀取為DataFrame對象的函數,其中常用read_csv和read_table讀取文件。0.png下面出現的例子中需要讀取的文件都存放在我自己的電腦 D:Pytho\notebookpydata-book-masterch06 中。
  • 如何用pandas更快地進行數據可視化?
    作者:劉早起來源:早起Python(公眾號)如果你經常使用Python進行數據分析,那麼對於pandas一定不會陌生,但是Pandas除了在數據處理上大放異彩,隨著版本的不斷更新,Pandas的繪圖功能在某些情況下甚至要比matplotlib更加適用,本文就將介紹如何用Pandas更快的進行數據可視化!
  • 數據科學 | pandas數據導入與導出
    當我們開始著手做一個數據分析項目時,選擇和導入數據集是第一個步驟,而導出數據雖然非必需,但有時候我們也需要保存處理或者分析後的結果,方便下次使用。在pandas中,它已經為我們提供了很多不同格式數據的導入和導出方法,下面這篇文章將具體介紹一些較為常用的方法,包括excel、csv文件以及資料庫的導入導出等。數據導入和導出是pandas中很基礎且重要的一個部分。
  • 使用Pandas數據處理與分析
    前言:這是關於個人關於對pandas可以進行的數據處理和數據分析的見解的初版,其中肯定不乏一些錯誤之處,希望大家能多多指正。pandas提供了一些用於將表格型數據讀取為DataFrame對象的函數。這些pandas的解析函數參數較為複雜,具體了解可以在pandas官網上自行查閱,或者可以再Jupyter Notebook 中採用help(pd.read_excel)命令查閱。2.審閱數據在成功導入數據以後,需要對數據進行審閱,目的是,了解數據結構、類型、大小等情況。
  • 數據處理技巧 | 帶你了解Pandas.groupby() 常用數據處理方法
    今天我們繼續推出一篇數據處理常用的操作技能匯總:靈活使用pandas.groupby()函數,實現數據的高效率處理,主要內容如下:pandas.groupby()三大主要操作介紹說到使用Python進行數據處理分析,那就不得不提其優秀的數據分析庫-Pandas,
  • Python數據分析利器,Pandas入門介紹,幫你便捷高效處理複雜數據
    關於Python的數據分析,當我們遇到的數據量小、數據結構簡單時,可以通過字典、列表等Python常見的數據結構來處理。但是當我們面對的大量數據以及複雜數據的局面時,就需要用一些專門用於數據分析的擴展庫來處理數據了。今天給大家介紹一個Python裡專門用來做數據分析和處理的擴展庫。
  • Python數據分析:pandas讀取和寫入數據
    我的公眾號是關於自己在數據分析/挖掘學習過程中的一些技術和總結分享,文章會持續更新......繼續深入學習pandas相關操作,數據讀取寫入、分組、合併,轉換等等。前面一篇文章裡已經寫了關於描述性統計以及常用的基本操作。接下來的一段時間裡,我將陸續地去掌握並輸出。這篇文章是關於數據讀取與寫入的知識點。