排序
排序:即對(duì)里面的數(shù)據(jù)按照大小,或者按照某種規(guī)則排序。
對(duì)DataFrame數(shù)據(jù)進(jìn)行排序與Series相似,Dataframe也有按sort_values()與 sort_index()分別按照值、索引進(jìn)行排序。
參數(shù)by=“columns_name”指定排序值參考列,默認(rèn)ascending=True按升序排序,指定inplace=True,將同時(shí)修改原數(shù)據(jù)??蓚魅隺xis=1,按行標(biāo)簽排序,不過用到的時(shí)候不多。
以近期粽子銷售數(shù)據(jù)為例介紹sort_values()的使用,數(shù)據(jù)結(jié)構(gòu)如下:
比如我們按照價(jià)格進(jìn)行排序,注意默認(rèn)是升序:
import pandas as pd
import numpy as np
# 按照發(fā)貨地分組
df = pd.read_csv('zongzi.csv')
df1 = df.sort_values(by='價(jià)格')
df1.head()
結(jié)果:
如果按照降序排列,則需要添加參數(shù)ascending=False
df1 = df.sort_values(by='價(jià)格',ascending=False)df1.head()
結(jié)果:
統(tǒng)計(jì)函數(shù)
padndas提供了豐富的統(tǒng)計(jì)、合并、分組、缺失值等操作函數(shù)。
比如靈活高效的groupby功能,它使你能以一種自然的方式對(duì)數(shù)據(jù)集進(jìn)行切片、切塊、摘要等操作。而如果使用groupby函數(shù)則肯定與下面的統(tǒng)計(jì)函數(shù)息息相關(guān)。
常用的統(tǒng)計(jì)函數(shù)有:
df.count() 非空元素計(jì)算
df.min() 最小值
df.max() 最大值
df.idxmin() 最小值的位置,類似于R中的which.min函數(shù)
df.idxmax() 最大值的位置,類似于R中的which.max函數(shù)
df.quantile(0.1) 10%分位數(shù)
df.sum() 求和
df.mean() 均值
df.median() 中位數(shù)
df.mode() 眾數(shù)
df.var() 方差
df.std() 標(biāo)準(zhǔn)差
df.mad() 平均絕對(duì)偏差
df.skew() 偏度
df.kurt() 峰度
df.describe() 一次性輸出多個(gè)描述性統(tǒng)計(jì)指標(biāo)
groupby使用介紹
分組運(yùn)算"split-apply-combine"(拆分-應(yīng)?-合并)。第?個(gè)階段,pandas對(duì)象(?論是Series、DataFrame還是其他的)中的數(shù)據(jù)會(huì)根據(jù)你所提供的?個(gè)或多個(gè)鍵被拆分(split)為多組。拆分操作是在對(duì)象的特定軸上執(zhí)?的。例如,DataFrame可以在其?(axis=0)或列(axis=1)上進(jìn)?分組。然后,將?個(gè)函數(shù)應(yīng)?(apply)到各個(gè)分組并產(chǎn)??個(gè)新值。最后,所有這些函數(shù)的執(zhí)?結(jié)果會(huì)被合并(combine)到最終的結(jié)果對(duì)象中。
groupby的語法結(jié)構(gòu)如下:
* by 分組的行或者列
* axis=0 行 / 1 列
* 如果有多層索引可以使用level
以近期粽子銷售數(shù)據(jù)為例介紹groupby的使用:
數(shù)據(jù)結(jié)構(gòu)如下
groupby對(duì)象的屬性和內(nèi)容獲取
import pandas as pd
import numpy as np
# 按照發(fā)貨地分組
df = pd.read_csv('zongzi.csv')
grouped = df.groupby('發(fā)貨地')
print(grouped)
打印結(jié)果:
<pandas.core.groupby.generic.dataframegroupby 0x11a97a950="" at="" object="">
查看grouped的組成groups
grouped.groups
當(dāng)然大家也可以對(duì)grouped進(jìn)行遍歷查看結(jié)果:
for group in grouped: print(group)
這么多分組,我們可以選擇一個(gè)分組進(jìn)行查看:
grouped.get_group('上海')
按照某一列分組并進(jìn)行統(tǒng)計(jì)
# 結(jié)合統(tǒng)計(jì)函數(shù)count(),進(jìn)行發(fā)貨地的個(gè)數(shù)統(tǒng)計(jì)
import pandas as pd
import numpy as np
# 按照產(chǎn)地分組并統(tǒng)計(jì)個(gè)數(shù)
df = pd.read_csv('zongzi.csv')
grouped = df.groupby('發(fā)貨地')
grouped['發(fā)貨地'].count().sort_values(ascending=False) # 統(tǒng)計(jì)各個(gè)發(fā)貨地的個(gè)數(shù)并降序排列
結(jié)果:
當(dāng)然也可以獲取各個(gè)店鋪商品的數(shù)量(注意如果是各個(gè)店鋪則是按照店鋪分組,然后再對(duì)商品名稱進(jìn)行個(gè)數(shù)統(tǒng)計(jì))
df['商品名稱'].groupby(df['店鋪']).count().sort_values(ascending=False)
結(jié)果:
各個(gè)店鋪的銷量總和,銷量列是字符串列
df.info()
所以在進(jìn)行求和之前我們要進(jìn)行轉(zhuǎn)換,只提取銷量的數(shù)字變成整型類型的
import pandas as pd
import numpy as np
import re
df = pd.read_csv('zongzi.csv')
# 清洗缺失值的數(shù)據(jù),進(jìn)行填充
df['銷量'].fillna('0人付款', inplace=True)
def convert_sale(row):
if '+' in row['銷量']:
row['銷量'] = row['銷量'].replace('+', '')
print(row)
if '萬' in row['銷量']:
return float(re.search(r'(.+)萬人付款', row['銷量']).group(1)) * 10000
else:
return int(re.search(r'(.+)人付款', row['銷量']).group(1))
df['銷量1'] = df.apply(convert_sale, axis=1)
然后計(jì)算總和:
df['銷量1'].groupby(df['店鋪']).sum().sort_values(ascending=False)
按照多列分組,比如每個(gè)發(fā)貨地的各個(gè)店鋪的銷量總和
df.groupby(['發(fā)貨地','店鋪'])['銷量1'].sum().sort_values(ascending=False)
獲取分組后的某一部分?jǐn)?shù)據(jù)可以使用如下格式:
grouped = df.groupby(by=['O', 'N'])
grouped.count()['M']
或
grouped['M'].count()
所以運(yùn)行后的結(jié)果:
當(dāng)然還有一些復(fù)雜的使用,下篇文章給大家詳細(xì)介紹。
更多關(guān)于“Python培訓(xùn)”的問題,歡迎咨詢千鋒教育在線名師。千鋒教育多年辦學(xué),課程大綱緊跟企業(yè)需求,更科學(xué)更嚴(yán)謹(jǐn),每年培養(yǎng)泛IT人才近2萬人。不論你是零基礎(chǔ)還是想提升,都可以找到適合的班型,千鋒教育隨時(shí)歡迎你來試聽。