数据框按行拼接_利用Python进行数据分析
1.一維數據分析
#導入numpy包 import numpy as np#導入panda包 import pandas as pdnumpy 一維數組 array
#定義:numpy一維數組array a=np.array([1,2,3,4,5])1)查詢元素
#查詢元素 a[0]輸出:
12)切片訪問
#切片訪問 a[1:4]輸出:
array([2, 3, 4])3)循環訪問
for i in a:print (i,'time 3 =',i*3)輸出:
1 time 3 = 3 2 time 3 = 6 3 time 3 = 9 4 time 3 = 12 5 time 3 = 154)數據類型
#數據類型 a.dtype輸出:
dtype('int32')- numpy 一維數組與列表的區別:
1)區別1:numpy 一維數組的統計功能
#一維數組的平均值 a.mean()輸出:
3.0#一維數組的標準差 a.std()輸出:
1.41421356237309512)區別2:numpy 一維數組的向量化計算
#向量相加 a[0:2]+a[3:5]輸出:
array([5, 7])#乘以標量 a[0:5]*10輸出:
array([10, 20, 30, 40, 50])pandas 一維數組 series
#定義:pandas一維數組series S1=pd.Series([1,2,3,4],index=['a','b','c','d'])描述統計:
#獲取描述統計信息 S1.describe()輸出:
count 4.000000 mean 2.500000 std 1.290994 min 1.000000 25% 1.750000 50% 2.500000 75% 3.250000 max 4.000000 dtype: float64iloc 和 loc:
- iloc屬性用于根據位置查詢值
輸出:
1- loc屬性用于根據索引獲取值
輸出:
1向量相加
#向量化運算:向量相加 S1=pd.Series([1,2,3,4],index=['a','b','c','d']) S2=pd.Series([5,6,7,8],index=['a','b','e','f']) S3=S1+S2 S3輸出 :
a 6.0 b 8.0 c NaN d NaN e NaN f NaN dtype: float64以上存在缺失值。有以下解決方法:
方法1:刪除缺失值
#刪除缺失值 S1=pd.Series([1,2,3,4],index=['a','b','c','d']) S2=pd.Series([5,6,7,8],index=['a','b','e','f']) S4=S1+S2 S4.dropna()輸出:
a 6.0 b 8.0 dtype: float64方法2:填充缺失值
#填充缺失值 S1=pd.Series([1,2,3,4],index=['a','b','c','d']) S2=pd.Series([5,6,7,8],index=['a','b','e','f']) S5=S1.add(S2,fill_value=0) S5輸出:
a 6.0 b 8.0 c 3.0 d 4.0 e 7.0 f 8.0 dtype: float642.二維數據分析
numpy二維數據結構
#定義:numpy二維數組 a=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])1)查詢元素
#查詢第一行,第三列元素 a[0,2]輸出:
32)獲取第n行
#獲取第2行 a[1,:]輸出:
array([5, 6, 7, 8])3)獲取第n列
#獲取第3列 a[:,2]輸出:
array([ 3, 7, 11])numpy數軸參數
1)按行計算
#按行計算:axis=1計算每一行 a.mean(axis=1)輸出:
array([ 2.5, 6.5, 10.5])1)按列計算
#按列計算:axis=0計算每一列 a.mean(axis=0)輸出:
array([ 5., 6., 7., 8.])pandas數據框(DataFrame)
#第1步:定義一個字典,映射列明與對應列的值 salesDict={'購藥時間':['2008-01-01 星期五','2018-01-02 星期六','2018-01-26 星期三'],'社??ㄌ?#39;:['001616528','001616528','0012602828'],'商品編碼':[236701,236701,236701],'商品名稱':['強力VC銀翹片','清熱解毒口服液','感康'],'銷售數量':[6,1,2],'應收金額':[82.8,28,16.8],'實收金額':[69,24.64,15] } #第2步:定義數據框,參數傳入字典 saleDf=pd.DataFrame(salesDict) saleDf輸出:
1)有序的數據框
#第1步:定義一個字典,映射列明與對應列的值 salesDict={'購藥時間':['2008-01-01 星期五','2018-01-02 星期六','2018-01-26 星期三'],'社保卡號':['001616528','001616528','0012602828'],'商品編碼':[236701,236701,236701],'商品名稱':['強力VC銀翹片','清熱解毒口服液','感康'],'銷售數量':[6,1,2],'應收金額':[82.8,28,16.8],'實收金額':[69,24.64,15] } #第2步:導入有序字典 from collections import OrderedDict #第3步:定義一個有序字典 salesOrderDict=OrderedDict(salesDict) #第4步:定義數據框:傳入字典,列名 salesDf=pd.DataFrame(salesOrderDict) salesDf輸出:
2)平均值
#按列計算平均值 salesDf.mean()輸出:
商品編碼 236701.000000 銷售數量 3.000000 應收金額 42.533333 實收金額 36.213333 dtype: float64- iloc屬性用于根據位置查詢值
1)查詢元素
#查詢元素 salesDf.iloc[1,2]輸出:
2367012)獲取第n行
#獲取第1行: salesDf.iloc[0,:]輸出:
購藥時間 2008-01-01 星期五 社保卡號 001616528 商品編碼 236701 商品名稱 強力VC銀翹片 銷售數量 6 應收金額 82.8 實收金額 69 Name: 0, dtype: object3)獲取第n列
#獲取第1列: saleDf.iloc[:,0]輸出:
0 2008-01-01 星期五 1 2018-01-02 星期六 2 2018-01-26 星期三 Name: 購藥時間, dtype: object- loc屬性用于根據索引查詢值
1)查詢元素
#查詢元素 salesDf.loc[0,'商品名稱']輸出
'強力VC銀翹片'2)獲取某行
#獲取第1行: salesDf.loc[0,:]輸出:
購藥時間 2008-01-01 星期五 社??ㄌ? 001616528 商品編碼 236701 商品名稱 強力VC銀翹片 銷售數量 6 應收金額 82.8 實收金額 69 Name: 0, dtype: object3)獲取某列
#獲取第1列: salesDf.loc[:,'商品名稱']或者:
#查詢 商品名稱 列 salesDf['商品名稱']輸出:
0 強力VC銀翹片 1 清熱解毒口服液 2 感康 Name: 商品名稱, dtype: object延伸:
#查詢 商品編碼 ,商品名稱,銷售數量 三列 salesDf[['商品編碼','商品名稱','銷售數量']]輸出:
4)切片功能
#查詢指定范圍 salesDf.loc[:,'商品編碼':'銷售數量']輸出:
5)通過條件判斷篩選
a. 構建查詢條件
querySer=salesDf.loc[:,'銷售數量']>2 querySer輸出:
0 True 1 False 2 False Name: 銷售數量, dtype: bool#查看數據類型 type(querySer)輸出:
pandas.core.series.Seriesb. 應用查詢條件
salesDf.loc[querySer,:]輸出:
數據分析的基本過程
數據分析步驟:
提出問題→理解數據→數據清洗→構建模型→數據可視化
1、提出問題
a.月均消費次數
b.月均消費金額
c.客單價
d.消費趨勢
2、理解數據
1)讀取Excel數據
#讀取Excel數據 fileNameStr='.../朝陽醫院2018年銷售數據.xlsx' xls=pd.ExcelFile(fileNameStr) salesDf=xls.parse('Sheet1')2)數據集描述統計信息
a. 打印前5行
#打印前5行 salesDf.head()輸出:
b. 統計行數,列數
#統計行數,列數 salesDf.shape輸出:
(6578, 7)c. 查詢某列的數據類型
#查看'購藥時間'一列的數據類型 salesDf.loc[:,'購藥時間'].dtype輸出:
dtype('O')d. 查看所有列的數據類型
#查看所有列的數據類型 salesDf.dtypes輸出:
購藥時間 object 社保卡號 object 商品編碼 object 商品名稱 object 銷售數量 object 應收金額 object 實收金額 object dtype: objecte.每一列的統計數
#每一列的統計數 salesDf.describe()輸出:
3、數據清洗
數據清洗的基本過程:
選擇子集→列名重命名→缺失數據處理→數據類型轉換→數據排序→異常值處理
1.選擇子集
#選擇子集 subSalesDf=salesDf.loc[0:4,'購藥時間':'銷售數量'] subSalesDf輸出:
2.列名重命名
colNameDict={'購藥時間':'銷售時間'} ''' inplace=False,數據框本身不會變,而會創建一個新數據框,inplace默認Flase; inplase=True,數據框本身會改動 ''' salesDf.rename(columns=colNameDict,inplace=True) salesDf.head()輸出:
3.缺失數據處理
print('刪除缺失值前的大小',salesDf.shape) salesDf=salesDf.dropna(subset=['銷售時間','社??ㄌ?#39;],how='any') print('刪除缺失值后的大小',salesDf.shape)輸出:
刪除缺失值前的大小 (6578, 7) 刪除缺失值后的大小 (6575, 7)4.數據類型轉換
(1)字符串轉化為數值
#字符串轉化為數值(浮點數) salesDf['銷售數量']=salesDf['銷售數量'].astype('float') salesDf['應收金額']=salesDf['應收金額'].astype('float') salesDf['實收金額']=salesDf['實收金額'].astype('float') print('轉化后的數據類型:n',salesDf.dtypes)輸出:
轉化后的數據類型:銷售時間 object 社??ㄌ? object 商品編碼 object 商品名稱 object 銷售數量 float64 應收金額 float64 實收金額 float64 dtype: object(2)處理日期
''' 定義函數:分割銷售日期,獲得銷售日期 輸出:timecolSer銷售時間一列是Series數據類型 輸出:分割后的時間,返回也是個Serries數據類型 ''' def splitSaletime(timeColSer):timeList=[]for value in timeColSer:dateStr=value.split(' ')[0]timeList.append(dateStr)#將列表轉換為一維數據Series類型timeSer=pd.Series(timeList)return timeSer #獲取銷售時間一列 timeSer=salesDf.loc[:,'銷售時間'] #分割字符串,獲取銷售日期 dateSer=splitSaletime(timeSer) #修改銷售時間一列的值 salesDf.loc[:,'銷售時間']=dateSer salesDf.head()輸出
(3)字符串轉換為日期
salesDf.loc[:,'銷售時間']=pd.to_datetime(salesDf.loc[:,'銷售時間'],format='%Y-%m-%d',errors='coerce') salesDf=salesDf.dropna(subset=['銷售時間','社保卡號'],how='any') salesDf.dtypes輸出:
銷售時間 datetime64[ns] 社??ㄌ? object 商品編碼 object 商品名稱 object 銷售數量 float64 應收金額 float64 實收金額 float64 dtype: object5.數據排序
#按銷售日期進行升序排序 salesDf=salesDf.sort_values(by='銷售時間',ascending=True) salesDf.head()輸出
#重命名行名(index) salesDf=salesDf.reset_index(drop=True) salesDf.head()輸出:
#每列的描述統計信息 salesDf.describe()輸出:
(6)異常值處理
#刪除異常值:通過條件判斷篩選出數據 #查詢條件 querySer=salesDf.loc[:,'銷售數量']>0 #應用查詢條件 print('刪除異常值前:',salesDf.shape) salesDf=salesDf.loc[querySer,:] print('刪除異常值后:',salesDf.shape)輸出:
刪除異常值前: (6549, 7) 刪除異常值后: (6506, 7)4、構建模型
業務指標1:月均消費次數=總消費次數/月份數
(總消費次數:同一天內,同一個人發生的所有消費算作一次消費)
求總消費次數
#第一步:刪除重復數據 kpi1_Df=salesDf.drop_duplicates(subset=['銷售時間','社保卡號']) #第二步:行數 totalⅠ=kpi1_Df.shape[0] print('總消費次數=',totalⅠ)輸出:
總消費次數= 5342求月份數
#第一步:排序 #按銷售時間升序 kpi1_Df=kpi1_Df.sort_values(by='銷售時間',ascending=True) #重命名排名 kpi1_Df=kpi1_Df.reset_index(drop=True) #第二步:獲取時間范圍 #最小時間值 startTime=kpi1_Df.loc[0,'銷售時間'] #最大時間值 endTime=kpi1_Df.loc[totalⅠ-1,'銷售時間'] #第三步:計算月份數 #天數 daysⅠ=(endTime-startTime).days #月份數 monthsⅠ=daysⅠ//30 print('月份數:',monthsⅠ)輸出
6求月均消費次數
kip1_Ⅰ=totalⅠ//monthsⅠ print('業務指標1:月均消費次數=',kip1_Ⅰ)輸出:
業務指標1:月均消費次數= 890業務指標2:月均消費金額=總消費金額/月份數
#總消費金額 totalMoneyF=salesDf.loc[:,'實收金額'].sum() #月均消費金額 monthMoneyF=totalMoneyF/monthsⅠ print('業務指標2:月均消費金額=',monthMoneyF)輸出
業務指標2:月均消費金額= 50668.351666666305業務指標3:客單價=總消費金額/總消費次數
pct=totalMoneyF/totalⅠ print('客單價:',pct)輸出:
客單價: 56.9094178210404總結:
數據分析步驟:
提出問題→理解數據→數據清洗→構建模型→數據可視化
數據清洗步驟:
選擇子集→列名重命名→缺失數據處理→數據類型轉換→數據排序→異常值處理
總結
以上是生活随笔為你收集整理的数据框按行拼接_利用Python进行数据分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《最后的荣光》新手挂机阵容推荐
- 下一篇: python写网络调试助手_Qt开源作品