Pandas数据分析常用数据操作(3年总结)
生活随笔
收集整理的這篇文章主要介紹了
Pandas数据分析常用数据操作(3年总结)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原創(chuàng)文章,轉(zhuǎn)載請注明來源,謝謝
導入設(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' # 顯示矢量圖,使圖形看起來更加清晰 %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è)置浮點數(shù)小數(shù)點后位數(shù) pd.set_option(‘display.float_format’, lambda x: ‘%.2f’ % x)調(diào)用幫助
help(pd.Series.loc)輸入輸出
讀寫csv
# 從當前文件夾子文件夾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ù)沒有字段標題(第一行當數(shù)據(jù),讀取5行) df.to_csv(path_or_buf = "df.csv",encoding = 'GBK') # df導出到df.csv文件,導出文件在當前文件夾下讀寫excel文件
# 讀寫單個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() # 讀取多個excel文件,同一個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ù)、個字段格式,內(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ù)類型的字段無法進行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浮點數(shù)保留2位小數(shù)點
# 將價格保留2位小數(shù)點 df['價格'] = round(df['價格'], 2) format = lambda x:'%.2f' % x df['價格'].applymap(format)字段重命名
df = df.rename(columns = {'index':'team_id'}) #將字段名index 重命名為 team_id # 多個字段重命名 df = df.rename(columns = {'index':'team_id','A':'B'}) #將字段名index/A 重命名為 team_id/B將多級列名轉(zhuǎn)換為一級列名
如下圖,聚合后列有多級列名,需要轉(zhuǎn)化為一級列名
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作為連接對象,只能做橫向連接# 表df1/df2 通過字段team_id連接,連接方式可以選擇outer/left/right df = pd.merge(df1,df2, on = 'team_id',how = "inner") # 表df1/df2 通過字段兩個字段team_id和ds連接 df = pd.merge(df1,df2, on = ['team_id','ds'],how = "inner") # 表df1/df2 通過字段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表字段名不相同,連接后只保留一個字段名 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")# 兩個字段相同的表,除重疊值列,其余列加上后綴 # 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)重復則報錯,默認outer join # 縱向連接 # df_2016,df_2017分別為兩個字段結(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去除重復值
team_id = df['team_id'].drop_duplicates()利用字段生成無重復列表
team_id = df['team_id'].drop_duplicates() team_id_list = team_id.tolist()列表轉(zhuǎn)換為dataframe
利用list1,coef,intercept三個列表生成字段名分別為 team_id,beta,alpha到dataframe c = {"team_id" : list1,"beta" : coef,"alpha" : intercept} df = pd.DataFrame(c)運用函數(shù)
# 對每個單元格運用函數(shù)map(), apply()
# 實現(xiàn):當單元格值小于0時,取0.005,大于0.01時取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ù),更簡潔 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超時率'].agg('mean') # 將df按城市分組求用戶超時率均值,結(jié)果為series # 將序列轉(zhuǎn)換為dataframe df = s.reset_index(name = '城市_用戶T超時率') # 將df轉(zhuǎn)換為dataframe,列名為'城市_用戶T超時率'# 對多列進行不同對聚合計算 group_cols = ['大區(qū)','城市'] agg_dict = {'KPI得分':['mean','max','min'],'KPI-gap':'mean'} df_x = df_kpi.groupby(group_cols).agg(agg_dict) # KPI得分列進行'mean','max','min'聚合運算,'KPI-gap'進行'mean'聚合運算數(shù)據(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進行排序計算分位數(shù)
# 計算某一列每個單元格數(shù)值的分位數(shù) df['PCNT_超時率'] = df['超時率'].rank(method='max',pct=True)# 計算某個分位數(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)計 df[df.isnull()] # 查看包含缺失值值的行 df[df['A'].isnull()] # 查看A列包含缺失值值的行 df[df.isnull().values==True].drop_duplicates() # 查看包含缺失值值的行,去除重復值# 缺失值填充 df.fillna({"goodcase_cnt":0,"badcase_cnt":0}) # 將goodcase_cnt/badcase_cnt缺失值填為0# 使用字典對不同列按不同值進行填充 values={"goodcase_cnt":10,"badcase_cnt":20} df.fillna(value=values) # goodcase_cnt列缺失值按10填充,badcase_cnt列缺失值按20填充df.fillna(df.mean()) # 用每列對均值進行填充 df['A'].fillna(df['A'].mean())# 只對column A 進行填充 df.fillna(method='bfill') # 用每列相鄰后面(back)的值進行填充 df.fillna(method='ffill') # 用每列相鄰前面(forward)的值進行填充數(shù)據(jù)替換
df.replace("a","f") # 用f替換a數(shù)據(jù)分箱
#將列'maxload'按-20,-18,-16...20進行分組 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進行分組分組百分比
# 將'current_load'按'tracking_count'求百分比 df.groupby('current_load')['tracking_count'].sum()/df['tracking_count'].sum()# 計算某一列不同數(shù)值的計數(shù)百分比 df.groupby('收貨城市')['訂單時段'].value_counts(normalize=True)重復數(shù)據(jù)
# s為Series,返回唯一值 s.unique() # 對于一維數(shù)組或者列表,unique函數(shù)去除其中重復的元素,并按元素由大到小返回一個新的無元素重復的元組或者列表 df.duplicated('Type') # 查找字段Type重復值,結(jié)果返回Type列每個單元格True or False df.drop_duplicates('Type',keep='last') df.index.duplicated() # 查找重復索引設(shè)置/取消索引
df.set_index('Country') # 將Country設(shè)置為df對index df.reset_index() # 取消索引數(shù)據(jù)子集選擇
列選擇
# 字段標簽方法 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']) # 選擇多個值 df[(df['city_name']=='上海') & (df['kpi_score']>=80)] # 滿足兩個字段的布爾方法# 布爾值方法,Series s1[s1>=80] # 選取s1中值大于80的元素# loc方法,loc的值必須為index列的值,比如假設(shè)team_id列為index列, df.loc['1034'] # 選擇team_id為1034的行,選擇行可以省略逗號,等價于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 列為三所大學的行# iloc方法, 只解釋整數(shù)輸入 df.iloc[1,:] # 選擇第2行,只選擇行可以沒有逗號,等價于df.iloc[1] df.iloc[1,3,5] # 選擇第2,4,6行# query方法 df.query('team_id == 1034') df.query("age>12 and sex=='male'")對于從df中取得的series,如果只有1行,但是行序號是原df中對序號,而不是0,比如,78,1017,因此1017不能通過s[0]訪問,需要使用s.iloc[0]同時選擇行列
# 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) #去除包含至少一個na值的行,只要有一個na,則該行drop掉 df.dropna(how='all') #去除所有值都為na值的行 df.dropna(thresh=2) #去除包含兩個及以上na值的行 df.dropna(subset = ['考核周期訂單量'],inplace=True) # 去除'考核周期訂單量'列為空值的行 df.drop(['a', 'c']) # 刪除索引為'a', 'c'對行 data[~(data['開關(guān)機狀態(tài)'].isin(['關(guān)']) & data['水流量'].isin([0]))] #刪除掉開關(guān)機狀態(tài)為“關(guān)”且水流量為0的數(shù)據(jù),說明熱水器不處于工作狀態(tài)?
總結(jié)
以上是生活随笔為你收集整理的Pandas数据分析常用数据操作(3年总结)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 彻底解决“刹车”争议!特斯拉中国召回超1
- 下一篇: 支持向量机原理及scikit-learn