Python pandas之?dāng)?shù)據(jù)處理

  • 數(shù)據(jù)寫入

我們可以將數(shù)據(jù)寫入到文件中進(jìn)行永久性的保存,支持的文件格式有HTML、CSV、JSON、Excel。
csv是最為常見的以純文本文件存儲數(shù)據(jù)文件的格式,它的優(yōu)點是通用性很強(qiáng),不受操作系統(tǒng)以及具體的軟件的限制。我們以寫入csv為例,看一下pandas是如何是將數(shù)據(jù)寫入csv文件中。

from pandas import Series,DataFrame

# 使用字典創(chuàng)建
index_list = ['001','002','003','004','005','006','007','008','009','010']
name_list = ['李白','王昭君','諸葛亮','狄仁杰','孫尚香','妲己','周瑜','張飛','王昭君','大喬']
age_list = [25,28,27,25,30,29,25,32,28,26]
salary_list = ['10k','12.5k','20k','14k','12k','17k','18k','21k','22k','21.5k']
marital_list = ['NO','NO','YES','YES','NO','NO','NO','YES','NO','YES']
dic={
    '姓名': Series(data=name_list,index=index_list),
    '年齡': Series(data=age_list,index=index_list),
    '薪資': Series(data=salary_list,index=index_list),
    '婚姻狀況': Series(data=marital_list,index=index_list)
    }
df=DataFrame(dic) 

# 寫入csv,path_or_buf為寫入文本文件
df.to_csv(path_or_buf='./People_Information.csv', encoding='utf_8_sig')
print('end')

在上面的代碼里,我們創(chuàng)建了一個DataFrame,接著通過to_csv()方法將DataFrame保存為csv文件。從結(jié)果中可以發(fā)現(xiàn),to_csv()保存數(shù)據(jù)時,df的行索引作為一列被輸出到csv文件中。
如何在保存csv文件的時候,不存儲DataFrame的行索引信息呢,我們看下面的解決方法。

df.to_csv(path_or_buf='./People_Information.csv',index=False,encoding='utf_8_sig')

在to_csv方法中將參數(shù)index設(shè)置為False就可以不存儲DataFrame的行索引信息。
to_csv()方法生成csv文件時,打開文件時都是亂碼,encoding參數(shù)設(shè)置“utf_8_sig”后亂碼就會消失。

  • 數(shù)據(jù)讀取

  • csv數(shù)據(jù)讀取
import pandas as pd
df = pd.read_csv('/data/People_Information.csv')
print(df)
print(df.shape)

調(diào)用read_csv()方法并傳入文件的路徑,就可以將數(shù)據(jù)讀取出來并且是DataFrame類型。read_csv()默認(rèn)會將文件中的第一行作為數(shù)據(jù)的列索引。
當(dāng)csv數(shù)據(jù)的第一行是一條臟數(shù)據(jù),不符合我們要求,可以利用read_csv()中的header參數(shù)進(jìn)行選擇哪一行作為列索引。

import pandas as pd
people = pd.read_csv('/data/People.csv',header = 0)
print(people.columns)
import pandas as pd
people = pd.read_csv('/data/People.csv',header = 1)
print(people.head())

read_csv()的header參數(shù)默認(rèn)是0,即取第一行的值;可以根據(jù)具體的要求設(shè)置header的值來確定列索引。如果都不滿足的你的要求,可以將header設(shè)置為None,列索引值會使用默認(rèn)的1、2、3、4,之后在自行設(shè)置。當(dāng)指定了header的值,讀出來的數(shù)據(jù)就是從該行開始向下切片,該行以上的數(shù)據(jù)會被忽略。

  • Excel文件讀取

Excel文件的讀取和csv的讀取方式相似,read_csv()讀取csv文件,read_excel()讀取Excel文件。

import pandas as pd
sheet = pd.read_excel('/data/sheet.xlsx')
print(sheet.head())

to_csv()會比to_excel()少一個sheet_name的參數(shù),這個參數(shù)就是可以指定表的名字。

import pandas as pd
sheet1 = pd.read_excel('/data/sheet.xlsx',sheet_name='sheet1')
print(sheet1.head())

sheet2 = pd.read_excel('/data/sheet.xlsx',sheet_name='sheet2')
print(sheet2.head())

在上面的代碼里,我們引入了帶有兩個表的sheet.xlsx的Excel文件,兩個表名分別為'sheet1','sheet2',然后我們通過指定sheet_name的值,獲取不同表中的數(shù)據(jù)。

  • 刪除數(shù)據(jù)

如果文件的單元格中沒有值時,在使用pandas讀取后就會用NaN表示,也就是我們常說的空值。在NumPy模塊中提供了nan的值,如果你想要創(chuàng)建一個空值,可以使用下方代碼:

from numpy import nan as NaN

注意,NaN其本身是一種float類型數(shù)據(jù)。但是,當(dāng)NaN參與到數(shù)據(jù)計算中,最終的結(jié)果卻永遠(yuǎn)都是NaN。所以,在我們不知道的情況下會影響我們的計算結(jié)果。
在DataFrame類型數(shù)據(jù)中,一般我們會將存在NaN的數(shù)據(jù)使用dropna()方法全部刪掉:

df1 = df.dropna()

dropna()是刪除空值數(shù)據(jù)的方法,默認(rèn)將只要含有NaN的整行數(shù)據(jù)刪掉,如果想要刪除整行都是空值的數(shù)據(jù)需要添加how='all'參數(shù)。如果想要對列做刪除操作,需要添加axis參數(shù),axis=1表示列,axis=0表示行。我們也可以使用thresh參數(shù)篩選想要刪除的數(shù)據(jù),thresh=n保留至少有n個非NaN數(shù)據(jù)的行。

from numpy import nan as NaN
import pandas as pd

df = pd.read_excel('/data/rate.xlsx')
print(df.shape)

df1=df.dropna(how='all')
print(df1.shape)

df2=df.dropna(axis=1)
print(df2.shape)

df3=df.dropna(axis=0)
print(df3.shape)

df4=df.dropna(thresh=3)
print(df4.shape)

只是單純的想刪除數(shù)據(jù),我們可以使用df.drop()方法:

DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False)

labels :就是要刪除的行列的名字,用列表給定。
index: 直接指定要刪除的行。
columns: 直接指定要刪除的列。
inplace=False:默認(rèn)該刪除操作不改變原數(shù)據(jù),而是返回一個執(zhí)行刪除操作后的新dataframe。
inplace=True:則會直接在原數(shù)據(jù)上進(jìn)行刪除操作,刪除后無法返回。
根據(jù)參數(shù)我們可以總結(jié)出,刪除行列有兩種方式:
1.labels=None,axis=0 的組合
2.index或columns直接指定要刪除的行或列

import pandas as pd
dic={
    "name":['zhangsan','lisi','wangwu'],
    "age":[23,32,24],
    "weight":[60,65,55]
}
df=pd.DataFrame(data=dic)
print(df)
df1=df.drop(labels=[0,1],axis=0)# 刪除第0行和第1行
print(df1)
df2=df.drop(columns='age',index=[0,1])
print(df2)
df3=df.drop(axis=1,columns='weight')# 刪除列名為weight的列
print(df3)
  • 空值的處理

對于空值我們可以將整條數(shù)據(jù)刪除,也可以使用fillna()方法對空值進(jìn)行填充。

df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

注意:method參數(shù)不能與value參數(shù)同時出現(xiàn)。

import pandas as pd
df = pd.read_excel('/data/rate.xlsx')
# 用常數(shù)填充fillna
# print(df.fillna(0))

# 用一列的平均值填充
# print(df.fillna(df.mean()))

# 用前面的值來填充ffill   
# print(df.fillna(method='ffill',axis=0))
  • 重復(fù)數(shù)據(jù)的處理

重復(fù)數(shù)據(jù)的存在有時不僅會降低分析的準(zhǔn)確度,也會降低分析的效率。所以我們在整理數(shù)據(jù)的時候應(yīng)該將重復(fù)的數(shù)據(jù)刪除掉。利用duplicated()函數(shù)可以返回每一行判斷是否重復(fù)的結(jié)果(重復(fù)則為True)。

import pandas as pd
df = pd.read_excel('/data/rate.xlsx')
# 返回重復(fù)的結(jié)果
print(df.duplicated())

返回的是一個值為Bool類型的Series,如果當(dāng)前行所有列的數(shù)據(jù)與前面的數(shù)據(jù)是重復(fù)的就返回True;反之,則返回False。可以使用drop_duplicates()將重復(fù)的數(shù)據(jù)行進(jìn)行刪除。

df.drop_duplicates()

我們也可以只可以通過判斷某一列的重復(fù)數(shù)據(jù),然后進(jìn)行刪除。

df.drop_duplicates(['CountryName'],inplace=False)

其中['CountryName']表示對比CountryName例數(shù)據(jù)是否有重復(fù),inplace用來控制是否直接對原始數(shù)據(jù)進(jìn)行修改。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容