Pandas数据分析常用数据操作(3年总结)
生活随笔
收集整理的這篇文章主要介紹了
Pandas数据分析常用数据操作(3年总结)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原創文章,轉載請注明來源,謝謝
導入設置
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之后顯示圖形顯示設置
#顯示所有列 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)? # 設置最大行寬 pd.set_option('max_colwidth',100) # 設置浮點數小數點后位數 pd.set_option(‘display.float_format’, lambda x: ‘%.2f’ % x)調用幫助
help(pd.Series.loc)輸入輸出
讀寫csv
# 從當前文件夾子文件夾data中讀取,設置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) # 數據沒有字段標題(第一行當數據,讀取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() # 行,列數 df.index() # 獲取index df.columns #獲取列 df.info() # 顯示dataframe行數、個字段格式,內存占用 df.head() # 顯示表前5行數據 df.count() # 非NA值到數量 df.describe() # 顯示數值型字段最大值、最小值、均值、25%,50%,75%分位數數據操作
數據類型轉換
# 不同數據類型的字段無法進行join df["team_id"] = df["team_id"].astype("int") # 將字段team_id格式轉換為int df['team_id']=df['team_id'].apply(str) # 將team_id格式轉換為string浮點數保留2位小數點
# 將價格保留2位小數點 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將多級列名轉換為一級列名
如下圖,聚合后列有多級列名,需要轉化為一級列名
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等情況,假設team_id為index列 df = pd.merge(df1,df2, left_index = True,right_on = True,how = "inner")# 兩個字段相同的表,除重疊值列,其余列加上后綴 # suffixes參數:字符串列表的元組,重疊列名后綴 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出現重復則報錯,默認outer join # 縱向連接 # df_2016,df_2017分別為兩個字段結構相同的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']) #輸出結果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()列表轉換為dataframe
利用list1,coef,intercept三個列表生成字段名分別為 team_id,beta,alpha到dataframe c = {"team_id" : list1,"beta" : coef,"alpha" : intercept} df = pd.DataFrame(c)運用函數
# 對每個單元格運用函數map(), apply()
# 實現:當單元格值小于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函數,更簡潔 df['beta'] = df.apply(lambda x: 0.0005 if x['beta'] < 0 else (0.01 if x['beta']>=0.01 else x)))數據分組聚合為Series,并轉化為dataframe
group_cols = '城市' s = df.groupby(group_cols)['用戶T超時率'].agg('mean') # 將df按城市分組求用戶超時率均值,結果為series # 將序列轉換為dataframe df = s.reset_index(name = '城市_用戶T超時率') # 將df轉換為dataframe,列名為'城市_用戶T超時率'# 對多列進行不同對聚合計算 group_cols = ['大區','城市'] 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'聚合運算數據分組聚合,計算列加權平均值
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進行排序計算分位數
# 計算某一列每個單元格數值的分位數 df['PCNT_超時率'] = df['超時率'].rank(method='max',pct=True)# 計算某個分位數的值 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) # 缺失值行數統計 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)的值進行填充數據替換
df.replace("a","f") # 用f替換a數據分箱
#將列'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()# 計算某一列不同數值的計數百分比 df.groupby('收貨城市')['訂單時段'].value_counts(normalize=True)重復數據
# s為Series,返回唯一值 s.unique() # 對于一維數組或者列表,unique函數去除其中重復的元素,并按元素由大到小返回一個新的無元素重復的元組或者列表 df.duplicated('Type') # 查找字段Type重復值,結果返回Type列每個單元格True or False df.drop_duplicates('Type',keep='last') df.index.duplicated() # 查找重復索引設置/取消索引
df.set_index('Country') # 將Country設置為df對index df.reset_index() # 取消索引數據子集選擇
列選擇
# 字段標簽方法 df['team_id'] df['team_id','city_name','kpi_score'] # loc方法 df.loc['team_id'] # iloc方法, 只接受整數輸入 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列的值,比如假設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方法, 只解釋整數輸入 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方法,只接受整數輸入>>> 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['開關機狀態'].isin(['關']) & data['水流量'].isin([0]))] #刪除掉開關機狀態為“關”且水流量為0的數據,說明熱水器不處于工作狀態?
總結
以上是生活随笔為你收集整理的Pandas数据分析常用数据操作(3年总结)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 彻底解决“刹车”争议!特斯拉中国召回超1
- 下一篇: 花鸟市场卖的观赏鱼超会赚钱,但背后真相很