30 個(gè) Pandas技巧,加速你的數(shù)據(jù)分析處理速度!


pandas的下載
使用命令下載:
pip?install?pandas?

https://www.lfd.uci.edu/~gohlke/pythonlibs/

pd_data?=?pd.DataFrame({
????"name":["小明","小紅","小孫","王小","關(guān)宇","劉蓓","張菲"],
????"age":[20,18,27,20,28,18,25],
????"sex":["男","女","男","男","男","女","女"],
????"score":[669,570,642,590,601,619,701],
????"address":["北京","深圳","廣州","武漢","深圳","廣州","長(zhǎng)沙"]
})
print(pd_data)

讀取本地文件
pd_data?=?pd.read_excel('./測(cè)試.xlsx')
pd.set_option('display.max_columns',?None)???#?顯示完整的列
pd.set_option('display.max_rows',?None)??#?顯示完整的行
pd.set_option('display.expand_frame_repr',?False)??#?設(shè)置不折疊數(shù)據(jù)
print(pd_data)

查看數(shù)據(jù)是否有缺失
#?如果缺失顯示為True,否則顯示False
isnull?=?pd_data.isnull()????????
print(isnull)
統(tǒng)計(jì)缺失值個(gè)數(shù)
#?統(tǒng)計(jì)缺失值個(gè)數(shù)
null_count?=?pd_data.isnull().sum()
print(null_count)
缺失值填充
#?填充數(shù)據(jù)?我選擇了8.888,你隨意
pd_data.fillna(8.888,?inplace=True)
print(pd_data)

缺失值刪除
#?如果有缺失值,刪除此行
exist_col?=?pd_data.dropna()
print(exist_col)

查看頭尾文件
#?查看頭尾文件
print('頭文件:',?pd_data.head())
print('尾文件:',?pd_data.tail())


#?單列值
pd_data?=?pd.read_excel('./測(cè)試.xlsx')
print(pd_data['全款價(jià)'])


取多列值
#?多列值
pd_data?=?pd.read_excel('./測(cè)試.xlsx')
print(pd_data[['車輛概況',?'全款價(jià)']])

單條件取值

pd_data?=?pd.read_excel('./測(cè)試.xlsx')
print(pd_data[pd_data['全款價(jià)']?==?4])
print('-'*100)
print(pd_data[pd_data['汽車排量']?==?'2.0T'])
多條件取值-與


#?多條件篩選數(shù)據(jù)
print(pd_data[(pd_data['車齡']?==?'2018年')?&?(pd_data['變速箱']?==?'自動(dòng)')])
多條件取值-或


#?多條件篩選數(shù)據(jù)
print(pd_data[(pd_data['車齡']?==?'2018年')?|?(pd_data['變速箱']?==?'自動(dòng)')])

字符串的開始函數(shù)

#?找出在?車輛概況?中以'大眾'開頭的
cars?=?pd_data[pd_data['車輛概況'].str.startswith('大眾')]
print(cars)

字符串的結(jié)尾函數(shù)

#?找出在?車輛概況?中以'豪華型'結(jié)尾的
cars?=?pd_data[pd_data['車輛概況'].str.endswith('豪華型')]
print(cars)

字符串的包含函數(shù)???????????????
#?找出在?車輛概況?中包含'進(jìn)口'的
cars?=?pd_data[pd_data['車輛概況'].str.contains('進(jìn)口')]
print(cars)
統(tǒng)計(jì)元素個(gè)數(shù)
#?統(tǒng)計(jì)?過戶分類?以及對(duì)應(yīng)次數(shù)
trans_count?=?pd_data['過戶情況'].value_counts()
print(trans_count)
為了便于進(jìn)一步的數(shù)據(jù)分析,我希望將它們置于不同的數(shù)組之中,可以采用如下方法:
#?統(tǒng)計(jì)?過戶分類?以及對(duì)應(yīng)次數(shù)
trans_count?=?pd_data['過戶情況'].value_counts()
#?針對(duì)于過戶情況的分類
x1_data?=?trans_count.index.tolist()????
#?分類后各組數(shù)據(jù)的統(tǒng)計(jì)
x2_data?=?trans_count.tolist()??????
print(x1_data)
print(x2_data)
這種格式的數(shù)據(jù)才是最適合做可視化分析的!
這里再多介紹兩種方法,條條大路通羅馬
都能輕松實(shí)現(xiàn)你的目標(biāo)。
#?統(tǒng)計(jì)?過戶分類?以及對(duì)應(yīng)次數(shù)
trans_count?=?pd_data['過戶情況'].value_counts()
#?針對(duì)于過戶情況的分類
x1_data?=?trans_count.index.tolist()
x11_data?=?trans_count.index
x12_data?=?trans_count.index.values
#?類后各組數(shù)據(jù)的統(tǒng)計(jì)
x2_data?=?trans_count.tolist()
print('index.tolist():',?x1_data)
print('index:',?x11_data)
print('index.values:',?x12_data)
print('x2:',?x2_data)

分割字符串
這個(gè)功能也很實(shí)用,大家可以看看我的汽車名稱數(shù)據(jù)這一列,我的目標(biāo)僅僅是車名而已,后面的車型、車齡、排列、變速箱信息對(duì)我來說都是冗余信息。
非常不利于我后續(xù)數(shù)據(jù)可視化
所以字符串分割在這里就顯得尤為重要。

#?對(duì)?汽車名稱?這一列按照空格分割?并取第一個(gè)字符
pd_data['汽車名稱']?=?pd_data['車輛概況'].map(lambda?x:?x.split("?")[0])
name?=?pd_data['汽車名稱'].value_counts()
#?汽車名稱分類
name1?=?name.index.tolist()??
#?汽車名稱對(duì)應(yīng)數(shù)量
name2?=?name.tolist()??
print(name1)
print(name2)
看到我取出來數(shù)據(jù)的樣子了嗎,要的就是這個(gè)!
清理數(shù)據(jù)
當(dāng)我們相對(duì)汽車?yán)锍套鲞M(jìn)一步的分析時(shí)會(huì)發(fā)現(xiàn)數(shù)據(jù)后面都有一個(gè)'萬(wàn)公里',這種數(shù)據(jù)要做可視化必須先對(duì)數(shù)據(jù)進(jìn)行處理,
就是先要去除數(shù)字后面的字符

我們可以使用字符串的replace()方法,使用空格替換字符
pd_data.loc[:,?'表顯里程new']?=?pd_data['表顯里程'].str.replace('萬(wàn)公里',?'').astype('float32')??#?去除?30?’萬(wàn)公里‘
#?保存數(shù)據(jù)
pd_data.to_excel('測(cè)試1.xlsx')黃色一列是我們處理之前的數(shù)據(jù)
綠色一列是我們處理之后的數(shù)據(jù)
已經(jīng)達(dá)到了我們想要的效果


劃分區(qū)間
現(xiàn)在有這么一個(gè)需求,我想要按照汽車的行駛里程分類,基本上每個(gè)車的行駛里程都是不一樣的,如果將每個(gè)數(shù)據(jù)都反映在圖標(biāo)上就會(huì)看起來很冗余,
也就失去了作圖的意義
所以我們可以按照區(qū)間來劃分,例如5w-10w公里、10w-15w公里這樣圖表展示展示出來的效果就會(huì)很好了。

pd_data.loc[:,?'表顯里程new']?=?pd_data['表顯里程'].str.replace('萬(wàn)公里',?'').astype('float32')??#?去除?30?’萬(wàn)公里‘
#?劃分區(qū)間
pd_data['里程區(qū)間']?=?pd.cut(pd_data['表顯里程new'],?[0,?2,?4,?6,?8,?10,?20],
?????????????????????????????labels=['0-2',?'2-4',?'4-6',?'6-8',?'8-10',?'>10'])
mile?=?pd_data['里程區(qū)間'].value_counts()
mile1?=?mile.index.tolist()?????????#?里程區(qū)間分類
mile2?=?mile.tolist()???????????????#?里程區(qū)間分類對(duì)應(yīng)數(shù)量
print(mile1)
print(mile2)

重置索引
其實(shí)我們?cè)谏厦姘咐难菔局幸呀?jīng)發(fā)現(xiàn)了,根據(jù)條件取出來的數(shù)據(jù)的索引都是處理數(shù)據(jù)之前的索引,
我們現(xiàn)在要重置索引的話要怎么辦呢?
我們可是使用reset_index()來索引重置
重置索引前:
#?找出在?過戶情況?中所有'0次'的汽車
cars?=?pd_data[pd_data['過戶情況'].str.contains('0次')]
print(cars.reset_index())
重置索引后:

很好,但是不完美。多了一列colm name叫做 index的先前序列號(hào)。
不想看到它,有辦法嗎?
drop = True
#?找出在?過戶情況?中所有'0次'的汽車
cars?=?pd_data[pd_data['過戶情況'].str.contains('0次')]
print(cars.reset_index(drop=True))

column重命名

#?重命名
pd_data?=?pd_data.rename(columns?=?{'車輛概況':'車輛詳情'})
print(pd_data)

分組統(tǒng)計(jì)groupby-單條件
#?統(tǒng)計(jì)不同變速箱總里程
pd_data.loc[:,?'表顯里程new']?=?pd_data['表顯里程'].str.replace('萬(wàn)公里',?'').astype('float32')????#?去除?30?’萬(wàn)公里‘
trans_mile?=?pd_data.groupby('變速箱')['表顯里程new'].sum()
print(trans_mile)
分組統(tǒng)計(jì)groupby-多條件
#?統(tǒng)計(jì)不同變速箱和過戶情況總里程
pd_data.loc[:,?'表顯里程new']?=?pd_data['表顯里程'].str.replace('萬(wàn)公里',?'').astype('float32')????#?去除?30?’萬(wàn)公里‘
trans_mile?=?pd_data.groupby(['變速箱','過戶情況'])['表顯里程new'].sum()
print(trans_mile)
如果再加上一個(gè)重置索引?trans_mile.reset_index()


求平均

#?統(tǒng)計(jì)不同過戶次數(shù)車輛平均里程
pd_data.loc[:,?'表顯里程new']?=?pd_data['表顯里程'].str.replace('萬(wàn)公里',?'').astype('float32')????#?去除?30?’萬(wàn)公里‘
trans_mile?=?pd_data.groupby('過戶情況')['表顯里程new'].mean()
print(trans_mile.reset_index())


apply函數(shù)
還記得我們爬取大學(xué)的那個(gè)教程嗎?
爬蟲+數(shù)據(jù)可視化選大學(xué),小學(xué)妹直呼牛X
我們爬出來的數(shù)據(jù)如果是985或者是211顯示為1,
如果非985或者211,顯示為2

現(xiàn)在我不想要1和2了,因?yàn)槲铱床欢鞘裁匆馑迹咳绻?85或者211,就顯示是,如果不是,就顯示否!
pd_data?=?pd.read_excel('./全國(guó)高校數(shù)據(jù).xlsx')
print(pd_data)
pd_data1?=?pd_data.copy()??#?生成一個(gè)副本,?防止數(shù)據(jù)損壞
pd_data['f985']?=?pd_data['f985'].apply(lambda?x:?'是'?if?x?==?1?else?'否')???????#?通過匿名函數(shù)解決
pd_data['f211']?=?pd_data['f985'].apply(lambda?x:?'是'?if?x?==?1?else?'否')???????#?通過匿名函數(shù)解決
print(pd_data)

同理利用lambda函數(shù)我們還可以
給省份這一列后面加個(gè)'省'
pd_data?=?pd.read_excel('./全國(guó)高校數(shù)據(jù).xlsx')
print(pd_data)
pd_data1?=?pd_data.copy()??#?生成一個(gè)副本,?防止數(shù)據(jù)損壞
pd_data['province_name']?=?pd_data['province_name'].apply(lambda?x:?x+'省')???????#?通過匿名函數(shù)解決
print(pd_data)
'''

同理利用lambda函數(shù)我們還可以給
人氣值view_total這一列最后面的'w'
pd_data['view_total']?=?pd_data['view_total'].apply(lambda?x:?x[:-1])???????#?通過匿名函數(shù)解決
print(pd_data)


求最大最小值
max_view_total?=?pd_data[pd_data['view_total']?==?pd_data['view_total'].max()]
print(max_view_total)

min_view_total?=?pd_data[pd_data['view_total']?==?pd_data['view_total'].min()]
print(min_view_total)


時(shí)間提取

為了便于演示,我加上了一列 Date 選項(xiàng),如下:

現(xiàn)在我們想提取其中的年份或者月份,我們可以使用 'DatetimeIndex'這個(gè)方法來實(shí)現(xiàn)。
pd_data?=?pd.read_excel('./全國(guó)高校數(shù)據(jù).xlsx')
pd_data['year']?=?pd.DatetimeIndex(pd_data['Date']).year
pd_data['month']?=?pd.DatetimeIndex(pd_data['Date']).month
pd_data['day']?=?pd.DatetimeIndex(pd_data['Date']).day
print(pd_data)


增加列
我想把剛才的生成的年+月+日方法到前三列,可以使用insert()方法來實(shí)現(xiàn)
Year?=?pd.DatetimeIndex(pd_data['Date']).year
Month?=?pd.DatetimeIndex(pd_data['Date']).month
day?=?pd.DatetimeIndex(pd_data['Date']).day
pd_data.insert(0,?'Year',?Year)
pd_data.insert(1,?'Month',?Month)
pd_data.insert(2,?'day',?day)
print(pd_data)





