Pandas数据分析常用数据操作(3年总结)
生活随笔
收集整理的這篇文章主要介紹了
Pandas数据分析常用数据操作(3年总结)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明來(lái)源,謝謝
導(dǎo)入設(shè)置
import odps import numpy as np import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] # matplotlib畫圖中文支持 plt.rcParams['axes.unicode_minus']=False # matplotlib畫圖中文支持 import seaborn as sns %config InlineBackend.figure_format = 'svg' # 顯示矢量圖,使圖形看起來(lái)更加清晰 %matplotlib inline # plot之后顯示圖形顯示設(shè)置
#顯示所有列 pd.set_option('display.max_columns', None) #最多顯示100列 pd.set_option('max_columns',100)? #顯示所有行 pd.set_option('display.max_rows', None) #最多顯示100行 pd.set_option(‘max_row’,100)? # 設(shè)置最大行寬 pd.set_option('max_colwidth',100) # 設(shè)置浮點(diǎn)數(shù)小數(shù)點(diǎn)后位數(shù) pd.set_option(‘display.float_format’, lambda x: ‘%.2f’ % x)調(diào)用幫助
help(pd.Series.loc)輸入輸出
讀寫csv
# 從當(dāng)前文件夾子文件夾data中讀取,設(shè)置index列為team_id df_kpi = pd.read_csv('data/team_KPI_data.csv',index_col='team_id') pd.read_csv('file.csv', header=None, nrows=5) # 數(shù)據(jù)沒(méi)有字段標(biāo)題(第一行當(dāng)數(shù)據(jù),讀取5行) df.to_csv(path_or_buf = "df.csv",encoding = 'GBK') # df導(dǎo)出到df.csv文件,導(dǎo)出文件在當(dāng)前文件夾下讀寫excel文件
# 讀寫單個(gè)excel文件 pd.read_excel('file.xlsx') pd.to_excel('dir/myDataFrame.xlsx', sheet_name='Sheet1') # 涉及到中文字符到讀寫 write = pd.ExcelWriter('file_name.xlsx') df.to_excel(write,sheet_name='sheet_name',index=False,encoding = 'gbk') write.save() # 讀取多個(gè)excel文件,同一個(gè)excel file不同的sheet df1 = pd.read_excel('file_name.xlsx', sheet_name = 'sheetname') df2 = pd.read_excel('file_name.xlsx', sheet_name = 'sheetname')xlsx = pd.ExcelFile('file.xls') df = pd.read_excel(xlsx, 'Sheet1')表信息查看
df.shape() # 行,列數(shù) df.index() # 獲取index df.columns #獲取列 df.info() # 顯示dataframe行數(shù)、個(gè)字段格式,內(nèi)存占用 df.head() # 顯示表前5行數(shù)據(jù) df.count() # 非NA值到數(shù)量 df.describe() # 顯示數(shù)值型字段最大值、最小值、均值、25%,50%,75%分位數(shù)數(shù)據(jù)操作
數(shù)據(jù)類型轉(zhuǎn)換
# 不同數(shù)據(jù)類型的字段無(wú)法進(jìn)行join df["team_id"] = df["team_id"].astype("int") # 將字段team_id格式轉(zhuǎn)換為int df['team_id']=df['team_id'].apply(str) # 將team_id格式轉(zhuǎn)換為string浮點(diǎn)數(shù)保留2位小數(shù)點(diǎn)
# 將價(jià)格保留2位小數(shù)點(diǎn) df['價(jià)格'] = round(df['價(jià)格'], 2) format = lambda x:'%.2f' % x df['價(jià)格'].applymap(format)字段重命名
df = df.rename(columns = {'index':'team_id'}) #將字段名index 重命名為 team_id # 多個(gè)字段重命名 df = df.rename(columns = {'index':'team_id','A':'B'}) #將字段名index/A 重命名為 team_id/B將多級(jí)列名轉(zhuǎn)換為一級(jí)列名
如下圖,聚合后列有多級(jí)列名,需要轉(zhuǎn)化為一級(jí)列名
level0 = df.columns.get_level_values(0) level1 = df.columns.get_level_values(1) df.columns = level0 + '_' + level1 df = df_kpi_team_avg.reset_index()表連接pd.merge(橫向連接)
# merge方法適用于使用列或者index作為連接對(duì)象,只能做橫向連接# 表df1/df2 通過(guò)字段team_id連接,連接方式可以選擇outer/left/right df = pd.merge(df1,df2, on = 'team_id',how = "inner") # 表df1/df2 通過(guò)字段兩個(gè)字段team_id和ds連接 df = pd.merge(df1,df2, on = ['team_id','ds'],how = "inner") # 表df1/df2 通過(guò)字段df1 字段team_id_A和ds_A和df2字段team_id_B和ds_B連接,left_on,right_on字段保持一致 df = pd.merge(df1,df2, left_on = ['team_id_A','ds_A'],right_on = ['team_id_B','ds_B'],how = "inner") # df1和df2表字段名不相同,連接后只保留一個(gè)字段名 pd.merge(df1,df2,left_on = 'team_id_A',right_on = 'team_id_B',how = "inner").drop(columns='team_id_B')# 連接字段是index等情況,假設(shè)team_id為index列 df = pd.merge(df1,df2, left_index = True,right_on = True,how = "inner")# 兩個(gè)字段相同的表,除重疊值列,其余列加上后綴 # suffixes參數(shù):字符串列表的元組,重疊列名后綴 left = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'v': [1, 2, 3]}) right = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'v': [4, 5, 6]})result = pd.merge(left, right, on='k') result1 = pd.merge(left, right, on='k', suffixes=['_l', '_r'])left right result result1k v k v k v_x v_y k v_l v_r 0 K0 1 0 K0 4 0 K0 1 4 0 K0 1 4 1 K1 2 1 K0 5 1 K0 1 5 1 K0 1 5 2 K2 3 2 K3 6left = left.set_index('k') right = right.set_index('k') result = left.join(right, lsuffix='_l', rsuffix='_r')# left right v_l v_rv v k k k K0 1 4.0 K0 1 K0 4 K0 1 5.0 K1 2 K0 5 K1 2 NaN K2 3 K3 6 K2 3 NaN表連接pd.concat(縱向連接,橫向連接)
# concat方法只適用于index之間等連接,如果index出現(xiàn)重復(fù)則報(bào)錯(cuò),默認(rèn)outer join # 縱向連接 # df_2016,df_2017分別為兩個(gè)字段結(jié)構(gòu)相同的dataframe # df_2016Shares Low High Symbol AAPL 80 95 110 TSLA 50 80 130 WMT 40 55 70 # df_2017Shares Low High Symbol AAPL 50 120 140 GE 100 30 40 IBM 87 75 95 SLB 20 55 85 TXN 500 15 23 TSLA 100 100 300 s_list =[df_2016,df_2017] df = pd.concat(s_list,keys=['2016','2017'],names=['Year']) #輸出結(jié)果Shares Low High Year Symbol 2016 AAPL 80 95 110TSLA 50 80 130WMT 40 55 70 2017 AAPL 50 120 140GE 100 30 40IBM 87 75 95SLB 20 55 85TXN 500 15 23TSLA 100 100 300df.reset_index() # 橫向連接 pd.concat(s_list, join='inner', keys=['2016', '2017'], axis='columns', names='Year') Year 2016 2017 Shares Low High Shares Low High Symbol AAPL 80 95 110 50 120 140 TSLA 50 80 130 100 100 300去除重復(fù)值
team_id = df['team_id'].drop_duplicates()利用字段生成無(wú)重復(fù)列表
team_id = df['team_id'].drop_duplicates() team_id_list = team_id.tolist()列表轉(zhuǎn)換為dataframe
利用list1,coef,intercept三個(gè)列表生成字段名分別為 team_id,beta,alpha到dataframe c = {"team_id" : list1,"beta" : coef,"alpha" : intercept} df = pd.DataFrame(c)運(yùn)用函數(shù)
# 對(duì)每個(gè)單元格運(yùn)用函數(shù)map(), apply()
# 實(shí)現(xiàn):當(dāng)單元格值小于0時(shí),取0.005,大于0.01時(shí)取0.01,其他情形取單元格值本身 def func(x):if x < 0:return 0.0005elif x >= 0.01:return 0.01else:return x df['beta'] = df.beta.map(func) # 或 df['beta'] = df.beta.apply(func)# 改為lambda函數(shù),更簡(jiǎn)潔 df['beta'] = df.apply(lambda x: 0.0005 if x['beta'] < 0 else (0.01 if x['beta']>=0.01 else x)))數(shù)據(jù)分組聚合為Series,并轉(zhuǎn)化為dataframe
group_cols = '城市' s = df.groupby(group_cols)['用戶T超時(shí)率'].agg('mean') # 將df按城市分組求用戶超時(shí)率均值,結(jié)果為series # 將序列轉(zhuǎn)換為dataframe df = s.reset_index(name = '城市_用戶T超時(shí)率') # 將df轉(zhuǎn)換為dataframe,列名為'城市_用戶T超時(shí)率'# 對(duì)多列進(jìn)行不同對(duì)聚合計(jì)算 group_cols = ['大區(qū)','城市'] agg_dict = {'KPI得分':['mean','max','min'],'KPI-gap':'mean'} df_x = df_kpi.groupby(group_cols).agg(agg_dict) # KPI得分列進(jìn)行'mean','max','min'聚合運(yùn)算,'KPI-gap'進(jìn)行'mean'聚合運(yùn)算數(shù)據(jù)分組聚合,計(jì)算列加權(quán)平均值
In [194]: list = ['a']* 4 + ['b'] * 6In [195]: list Out[195]: ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'b']In [196]: df = DataFrame({'category' : list,...: 'data': np.random.randn(10),...: 'weights': np.random.rand(10)})In [197]: df Out[197]:category data weights 0 a -0.223955 0.017115 1 a 0.627805 0.204209 2 a -0.895798 0.904739 3 a 1.254223 0.551053 4 b -1.024985 0.904737 5 b -0.027101 0.263672 6 b -2.501462 0.364224 7 b 0.008169 0.805655 8 b 1.603461 0.630892 9 b -1.099844 0.596945In [198]: grouped = df.groupby('category')In [199]: get_wavg = lambda g : np.average(g['data'],weights=g['weights'])In [200]: grouped.apply(get_wavg) Out[200]: category a 0.003011 b -0.416120 dtype: float64排序
df.sort_index() #按索引排序 df.sort_values(by='country') # df按列country進(jìn)行排序計(jì)算分位數(shù)
# 計(jì)算某一列每個(gè)單元格數(shù)值的分位數(shù) df['PCNT_超時(shí)率'] = df['超時(shí)率'].rank(method='max',pct=True)# 計(jì)算某個(gè)分位數(shù)的值 data.price.quantile([0.25,0.5,0.75]) //輸出 0.25 42812.25 0.50 57473.00 0.75 76099.75缺失值填充
# 缺失值行查看 df.isnull().sum(axis=0) # 缺失值行數(shù)統(tǒng)計(jì) df[df.isnull()] # 查看包含缺失值值的行 df[df['A'].isnull()] # 查看A列包含缺失值值的行 df[df.isnull().values==True].drop_duplicates() # 查看包含缺失值值的行,去除重復(fù)值# 缺失值填充 df.fillna({"goodcase_cnt":0,"badcase_cnt":0}) # 將goodcase_cnt/badcase_cnt缺失值填為0# 使用字典對(duì)不同列按不同值進(jìn)行填充 values={"goodcase_cnt":10,"badcase_cnt":20} df.fillna(value=values) # goodcase_cnt列缺失值按10填充,badcase_cnt列缺失值按20填充df.fillna(df.mean()) # 用每列對(duì)均值進(jìn)行填充 df['A'].fillna(df['A'].mean())# 只對(duì)column A 進(jìn)行填充 df.fillna(method='bfill') # 用每列相鄰后面(back)的值進(jìn)行填充 df.fillna(method='ffill') # 用每列相鄰前面(forward)的值進(jìn)行填充數(shù)據(jù)替換
df.replace("a","f") # 用f替換a數(shù)據(jù)分箱
#將列'maxload'按-20,-18,-16...20進(jìn)行分組 pd.cut(df['maxload'],bins = range(-20,20,2)) pd.cut(df['maxload'],bins = (0,5,10,15,20)) #將列'maxload'按0,5,10,15,20進(jìn)行分組分組百分比
# 將'current_load'按'tracking_count'求百分比 df.groupby('current_load')['tracking_count'].sum()/df['tracking_count'].sum()# 計(jì)算某一列不同數(shù)值的計(jì)數(shù)百分比 df.groupby('收貨城市')['訂單時(shí)段'].value_counts(normalize=True)重復(fù)數(shù)據(jù)
# s為Series,返回唯一值 s.unique() # 對(duì)于一維數(shù)組或者列表,unique函數(shù)去除其中重復(fù)的元素,并按元素由大到小返回一個(gè)新的無(wú)元素重復(fù)的元組或者列表 df.duplicated('Type') # 查找字段Type重復(fù)值,結(jié)果返回Type列每個(gè)單元格True or False df.drop_duplicates('Type',keep='last') df.index.duplicated() # 查找重復(fù)索引設(shè)置/取消索引
df.set_index('Country') # 將Country設(shè)置為df對(duì)index df.reset_index() # 取消索引數(shù)據(jù)子集選擇
列選擇
# 字段標(biāo)簽方法 df['team_id'] df['team_id','city_name','kpi_score'] # loc方法 df.loc['team_id'] # iloc方法, 只接受整數(shù)輸入 df.iloc[:,1] # 選擇第2列行選擇
# 布爾值方法,dataframe df[df['team_id']==1034] # 取team_id為1034的行,主要“==“ df[df['team_id'].isin(['162586803','135330914']) # 選擇多個(gè)值 df[(df['city_name']=='上海') & (df['kpi_score']>=80)] # 滿足兩個(gè)字段的布爾方法# 布爾值方法,Series s1[s1>=80] # 選取s1中值大于80的元素# loc方法,loc的值必須為index列的值,比如假設(shè)team_id列為index列, df.loc['1034'] # 選擇team_id為1034的行,選擇行可以省略逗號(hào),等價(jià)于df.loc['1034',:] df.loc['1034','1035'] # 選擇team_id為1034,1035的行 labels = ['University of Alaska Anchorage','International Academy of Hair Design','University of Alabama in Huntsville'] college.loc[labels] #選擇index 列為三所大學(xué)的行# iloc方法, 只解釋整數(shù)輸入 df.iloc[1,:] # 選擇第2行,只選擇行可以沒(méi)有逗號(hào),等價(jià)于df.iloc[1] df.iloc[1,3,5] # 選擇第2,4,6行# query方法 df.query('team_id == 1034') df.query("age>12 and sex=='male'")對(duì)于從df中取得的series,如果只有1行,但是行序號(hào)是原df中對(duì)序號(hào),而不是0,比如,78,1017,因此1017不能通過(guò)s[0]訪問(wèn),需要使用s.iloc[0]同時(shí)選擇行列
# iloc方法,只接受整數(shù)輸入>>> college.iloc[:3, :4] # 選擇1-3行,1-4列>>> college.iloc[:, [4,6]] #選擇5-6列>>> college.iloc[[100, 200], [7, 15]] # 選擇99-199行,第8-15列 # iat方法,和iloc基本類似# loc方法,只接受index列的值輸入 >>> college.loc[:'Amridge University', :'MENONLY'] #選擇1-'Amridge University'行,1-'MENONLY'列 >>> college.loc[:, ['WOMENONLY', 'SATVRMID']] #選擇'WOMENONLY'到'SATVRMID'列 >>> rows = ['GateWay Community College','American Baptist Seminary of the West'] >>> columns = ['SATMTMID', 'UGDS_NHPI'] >>> college.loc[rows, columns] ## 利用get_loc方法 >>> col_start = college.columns.get_loc('UGDS_WHITE') >>> col_end = college.columns.get_loc('UGDS_UNKN') + 1 >>> college.iloc[:5, col_start:col_end] #at方法,和loc方法基本類似刪除列
drop_columns=['beta','alpha'] df_kpi_public = df_kpi.drop(columns = drop_columns) #去除'beta','alpha'列刪除行
# 刪除空值行 df.dropna(inplace=True) #去除包含至少一個(gè)na值的行,只要有一個(gè)na,則該行drop掉 df.dropna(how='all') #去除所有值都為na值的行 df.dropna(thresh=2) #去除包含兩個(gè)及以上na值的行 df.dropna(subset = ['考核周期訂單量'],inplace=True) # 去除'考核周期訂單量'列為空值的行 df.drop(['a', 'c']) # 刪除索引為'a', 'c'對(duì)行 data[~(data['開(kāi)關(guān)機(jī)狀態(tài)'].isin(['關(guān)']) & data['水流量'].isin([0]))] #刪除掉開(kāi)關(guān)機(jī)狀態(tài)為“關(guān)”且水流量為0的數(shù)據(jù),說(shuō)明熱水器不處于工作狀態(tài)?
總結(jié)
以上是生活随笔為你收集整理的Pandas数据分析常用数据操作(3年总结)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 彻底解决“刹车”争议!特斯拉中国召回超1
- 下一篇: 花鸟市场卖的观赏鱼超会赚钱,但背后真相很