【Python学习笔记—保姆版】第四章—关于Pandas、数据准备、数据处理、数据分析、数据可视化
第四章
歡迎訪問我搞事情的【知乎賬號】:Coffee
以及我的【B站漫威剪輯賬號】:VideosMan
若我的筆記對你有幫助,請用小小的手指,點一個大大的贊哦。
#編譯器使用的是sypder,其中">>>"代表輸入和執行的內容
>>> print(‘Hello World’) #執行代碼
Hello World #輸出值
【Python學習筆記—保姆版】第四章
- 第四章
- 1、關于Pandas
- 2、數據準備
- pandas和numpy
- 創建DataFrame
- 1.標準格式創建:
- 2 .傳入等長的列表組成的字典來創建:
- **3 傳入嵌套字典(字典的值也是字典)創建DataFrame**
- 增刪改查
- 1.增加值
- 1.增加列。直接為不存在的列賦值就會創建新的列
- 2.增加行
- 3.刪除行和列:axis代表選中的是行還是列,列是1,行是2.inplace代表有沒有真正刪除
- 改
- DataFrame
- 一、某列所有值
- 二、某行所有值
- 三、某行某列對應值df_signal[‘a’].iloc[-1]
- 四、刪除特定行
- 五、**Python DataFrame 按條件篩選數據**
- 六、排序
- 數據導入
- 3、數據處理
- 4.3.1 數據清洗
- 1、重復值的處理:drop_duplicates()
- 2、缺失值處理:
- 1. dropna() 去除數據結構中值為空的數據行
- 2. df.fillna() 用其他數值替代NaN,有些時候空數據直接刪除會影響分析的結果,可以對數據進行填補。【例4-8】使用數值或者任意字符替代缺失值
- 3. df.fillna(method='pad') 用前一個數據值替代NaN
- 4. df.fillna(method='bfill') 用后一個數據值替代NaN
- 5. df.fillna(df.mean()) 用平均數或者其他描述性統計量來代替NaN。
- 6. df.fillna(df.mean()[math: physical]) 可以選擇列進行缺失值的處理
- 7. strip():清除字符型數據左右(首尾)指定的字符,默認為空格,中間的不清除。
- 3、特定值替換:replace('缺考', 0)
- 4、刪除滿足條件元素所在的行:drop()
- 4.3.2 數據抽取
- 1. 字段抽取:抽出某列上指定位置的數據做成新的列。
- 2. 字段拆分:按指定的字符sep,拆分已有的字符串。
- 3. 記錄抽取:是指根據一定的條件,對數據進行抽取。
- 4. 隨機抽樣:是指隨機從數據中按照一定的行數或者比例抽取數據。
- PS:按照指定條件抽取數據:
- 5. 字典數據:將字典數據抽取為dataframe,有三種方法。
- 4.3.3 排名索引
- 說明:axis、ascending、inplace、by
- **1. 排名排序(索引排序):df.sort_index()**
- 2.重新索引:.reindex(index=None,**kwargs)
- 3. 值排序:df.sort_values()
- **4、sort_values()中的na_position參數**
- 5、“值排名”:rank()函數
- 4.3.4 數據合并
- 1. 記錄合并:是指兩個結構相同的數據框合并成一個數據框。也就是在一個數據框中追加另一個數據框的數據記錄。pd.concat([df1,df2])
- 2. 字段合并:是指將同一個數據框中的不同的列進行合并,形成新的列。X = x1+x2+…
- 3. 字段匹配:是指不同結構的數據框(兩個或以上的數據框),按照一定的條件進行合并,即追加列。merge(x,y,left_on,right_on) 外鍵連接
- 4.3.5 數據計算
- 1. 簡單計算:通過對各字段進行加、減、乘、除等四則算術運算,計算出的結果作為新的字段。
- 2. 數據標準化:是指將數據按照比例縮放,使之落入特定的區間,一般使用0-1標準化。X*=(x-min)/(max-min)
- 4.3.6 數據分組
- 說明:pd.cut(series,bins,right=True,labels=NULL)
- bins
- labels
- 4.3.7 日期處理
- 1. 日期轉換:是指將字符型的日期格式轉換為日期格式數據的過程。
- 2. 日期格式化:是指將日期型的數據按照給定的格式轉化為字符型的數據。
- 3. 日期抽取:是指從日期格式里面抽取出需要的部分屬性
- 4. 日期判斷:
- 5.日期增長:
- 4、數據分析
- 4.4.1 基本統計:describe
- 4.4.2 分組分析:groupby(離散值分組)
- 4.4.3 分布分析:cut+groupby(連續值分組)
- 4.4.4 交叉分析:pivot_table(數據透視表)
- 4.4.5 結構分析:pivot_table+sum+div(查比重)
- 4.4.6 相關分析:corr(一維、二維)
- 5、數據可視化
- 相關注意
- 4.5.1 餅圖:plt.pie(gb2.人數,labels=gb2.index,autopct='%.2f%%',colors=['b','pink',(0.5,0.8,0.3)],explode=[0,0,0,0,0.1])
- 4.5.2 散點圖:plt.plot(df.高代,df.數分,'o',color='pink')
- 4.5.3 折線圖:plt.plot(df.學號,df.總分,'-',color='r')
- 4.5.4 柱形圖:plt.bar(df.學號后三位,df.總分,width=1,color=['r','b'])
- 4.5.5 直方圖:plt.hist(df2.C語言程序設計,bins=10,color='g',cumulative=True)
- 這是我的線上筆記,希望對你有所幫助;你的點贊收藏,是我堅持的最大動力
1、關于Pandas
Pandas的中文網,介紹得非常詳細
https://www.pypandas.cn/docs/
2、數據準備
pandas和numpy
import pandas as pd import pandas as Series import numpy as np from pandas import DataFrame-
pandas:生成數據框,處理數據框
import pandas as pd DataFrame、Series -
numpy:一些特殊的數值,可視化的使用
import numpy as np比如
方法解釋 np.nan 空值(缺失值) np.inf 無窮( -inf 或 +inf ) np.arange(16) 返回一個有終點和起點的固定步長的排列 np.random 生成隨機數 np.array([1,2,3,4]) 返回一個自定義的排列 方法效果 numpy.size 人數 numpy.mean 平均值 numpy.var 方差 numpy.std 標準差 numpy.max 最高分 numpy.min 最低分
創建DataFrame
1.標準格式創建:
>>> from pandas import DataFrame>>> df = DataFrame(np.arange(16).reshape(4,4),index=['a','b','c','d'],columns =['one','two','three','four'])>>> dfone two three foura 0 1 2 3b 4 5 6 7c 8 9 10 11d 12 13 14 152 .傳入等長的列表組成的字典來創建:
>>> data = {'a':[5,8],'b':[1,0]}>>> df = DataFrame(data)>>> dfa b0 5 11 8 0同時也可以指定列索引序列
>>> df = DataFrame(data,columns = ['b','a'])>>> dfb a0 1 51 0 83 傳入嵌套字典(字典的值也是字典)創建DataFrame
其中我們可以知道,外層鍵是列索引,內層子鍵是行索引
>>> nest_dict={'shanghai':{2015:100,2016:101},'beijing':{2015:102,2016:103}}>>> df = DataFrame(nest_dict)>>> dfshanghai beijing2015 100 1022016 101 103>>> nest_dict={'shanghai':{2015:100,2016:101},'beijing':{2015:102,2014:103}}>>> df = DataFrame(nest_dict)>>> dfshanghai beijing2014 NaN 103.02015 100.0 102.02016 101.0 NaN增刪改查
(1 封私信 / 4 條消息) dataframe修改某列的值 - 搜索結果 - 知乎 (zhihu.com)
(20條消息) pandas:dataframe在指定位置插入一行數據_碧海藍天-CSDN博客_dataframe插入一行數據
(22條消息) Python中pandas dataframe刪除一行或一列:drop函數_海晨威-CSDN博客_dataframe drop
1.增加值
1.增加列。直接為不存在的列賦值就會創建新的列
df['Hefei'] = 1 dfshanghai beijing Hefei
2014 NaN 103.0 1
2015 100.0 102.0 1
2016 101.0 NaN 1
2.增加行
利用loc方法,當然也可以使用append方法,不過傳入的需要是字典形式。
>>> df.loc[4]={'shanghai':5,'beijing':13, 'Hefei':50} >>> dfshanghai beijing Hefei 2014 NaN 103.0 1 2015 100.0 102.0 1 2016 101.0 NaN 1 4 5.0 13.0 50 >>> df.loc[2]={'shanghai':5,'beijing':13, 'Hefei':50} >>> dfshanghai beijing Hefei 2014 NaN 103.0 1 2015 100.0 102.0 1 2016 101.0 NaN 1 4 5.0 13.0 50 2 5.0 13.0 503.刪除行和列:axis代表選中的是行還是列,列是1,行是2.inplace代表有沒有真正刪除
>>> df.drop('Hefei',axis = 1,inplace = True)>>> dfshanghai beijing2014 NaN 1032015 100 1022016 101 NaN4 5 132 5 133 5 13df.drop(3,axis = 0,inplace = True)>>> dfshanghai beijing2014 NaN 1032015 100 1022016 101 NaN4 5 132 5 13改
改操作主要記住就是從列開始
>>> dfshanghai beijing 2014 6 6 2015 100 102 2016 101 NaN 4 5 13 2 5 13 >>> df[:3]shanghai beijing 2014 6 6 2015 100 102 2016 101 NaN >>> df[1] = 3 >>> dfshanghai beijing 1 2014 6 6 3 2015 100 102 3 2016 101 NaN 3 4 5 13 3 2 5 13 3DataFrame
df.info(): # 打印摘要 df.describe(): # 描述性統計信息 df.values: # 數據 <ndarray> df.to_numpy() # 數據 <ndarray> (推薦) df.shape: # 形狀 (行數, 列數) df.columns: # 列標簽 <Index> df.columns.values: # 列標簽 <ndarray> df.index: # 行標簽 <Index> df.index.values: # 行標簽 <ndarray> df.head(n): # 前n行 df.tail(n): # 尾n行 pd.options.display.max_columns=n: # 最多顯示n列 pd.options.display.max_rows=n: # 最多顯示n行 df.memory_usage(): # 占用內存(字節B)np.random.seed(1234) d1 = pd.Series(2*np.random.normal(size = 100)+3) d2 = np.random.f(2,4,size = 100) d3 = np.random.randint(1,100,size = 100) d1.count() #非空元素計算 d1.min() #最小值 d1.max() #最大值 d1.idxmin() #最小值的位置,類似于R中的which.min函數 d1.idxmax() #最大值的位置,類似于R中的which.max函數 d1.quantile(0.1) #10%分位數 d1.sum() #求和 d1.mean() #均值 d1.median() #中位數 d1.mode() #眾數 d1.var() #方差 d1.std() #標準差 d1.mad() #平均絕對偏差 d1.skew() #偏度 d1.kurt() #峰度 d1.describe() #一次性輸出多個描述性統計指標np.nan #賦空值一、某列所有值
df['a']#取a列 df[['a','b']]#取a、b列二、某行所有值
# 前n行,后n行 df.head(n) df.tail(n)#iloc只能用數字索引,不能用索引名------(左閉右開) df.iloc[0:2]#前2行 df.iloc[0]#第0行 df.iloc[0:2,0:2]#0、1行,0、1列 df.iloc[[0,2],[1,2,3]]#第0、2行,1、2、3列# 選取等于某些值的行記錄 用 == df.loc[df['column_name'] == some_value]# 選取某列是否是某一類型的數值 用 isin df.loc[df['column_name'].isin(some_values)]# 多種條件的選取 用 & df.loc[(df['column'] == some_value) & df['other_column'].isin(some_values)]# 選取不等于某些值的行記錄 用 != df.loc[df['column_name'] != some_value]# isin返回一系列的數值,如果要選擇不符合這個條件的數值使用~ df.loc[~df['column_name'].isin(some_values)] #提取出某行某列li=list(df.columns)df.iloc[[3,4,8],[li.index('animal'),li.index('age')]]三、某行某列對應值df_signal[‘a’].iloc[-1]
#iat取某個單值,只能數字索引df.iat[1,1]#第1行,1列#at取某個單值,只能index和columns索引df.at[‘one’,‘a’]#one行,a列
💡 index只能批量操作,不支持單個修改四、刪除特定行
# 要刪除列“score”<50的所有行:df = df.drop(df[df.score < 50].index)df = df.drop(df[df['score'] < 50].index)df.drop(df[df.score < 50].index, inplace=True)df.drop(df[df['score'] < 50].index, inplace=True)# 多條件情況# 可以使用操作符: | 只需其中一個成立, & 同時成立, ~ 表示取反,它們要用括號括起來。# 例如刪除列“score<50 和>20的所有行df = df.drop(df[(df.score < 50) & (df.score > 20)].index五、Python DataFrame 按條件篩選數據
點擊查看更多內容
比如我想查看id等于11396的數據。 pdata1[pdata1['id']==11396] pdata1[pdata1.id==11396]查看時間time小于25320的數據。 pdata1[pdata1['time']<25320] pdata1[pdata1.time<25320]查看time小于25320且大于等于25270的數據 pdata1[(pdata1['time'] < 25320)&(pdata1['time'] >= 25270)]可以根據篩選條件查看某幾列 pdata1[(pdata1['time'] < 25320)&(pdata1['time'] >= 25270)][['x','y']] 注意多個條件要加括號后在&或|。六、排序
點擊查看更多內容
#表示pd按照xxx這個字段排序,inplace默認為False,如果該值為False,那么原來的pd順序沒變,只是返回的是排序的 pd.sort_values("xxx",inplace=True)數據導入
從excel導入
from pandas import read_excel df = read_excel('e://rz2.xlsx') df從csv導入
from pandas import read_csv path4 = 'C:\\Users\\admin\\Desktop\\大數據爬蟲2\\合并\\主鍵外連接.csv' df5 = read_csv(path4,engine='python')3、數據處理
df3=pd.merge(df1,df2,left_on='學號',right_on='學號') #外鍵連接 df3=df3.drop(columns=['手機號碼']) df3 df3=df3.replace('缺考', 0) #特殊值代替數據分析的第一步是提高數據質量。數據清洗要做的就是處理缺失數據以及清除無意義的信息。這是數據價值鏈中最關鍵的步驟。垃圾數據,即使是通過最好的分析,也將產生錯誤的結果,并誤導業務本身。
4.3.1 數據清洗
1、重復值的處理:drop_duplicates()
drop_duplicates() 把數據結構中行相同的數據去除(保留其中的一行)【例4-6】數據去重。
這里df是原始數據,其中7、9行、8、10行是重復行
Out[1]:
YHM TCSJ YWXT IP
0 S1402048 18922254812 1.225790e+17 221.205.98.55
1 S1411023 13522255003 1.225790e+17 183.184.226.205
2 S1402048 13422259938 NaN 221.205.98.55
3 20031509 18822256753 NaN 222.31.51.200
4 S1405010 18922253721 1.225790e+17 120.207.64.3
5 20140007 NaN 1.225790e+17 222.31.51.200
6 S1404095 13822254373 1.225790e+17 222.31.59.220
7 S1402048 13322252452 1.225790e+17 221.205.98.55
8 S1405011 18922257681 1.225790e+17 183.184.230.38
9 S1402048 13322252452 1.225790e+17 221.205.98.55
10 S1405011 18922257681 1.225790e+17 183.184.230.38
Out[2]:
YHM TCSJ YWXT IP
0 S1402048 18922254812 1.225790e+17 221.205.98.55
1 S1411023 13522255003 1.225790e+17 183.184.226.205
2 S1402048 13422259938 NaN 221.205.98.55
3 20031509 18822256753 NaN 222.31.51.200
4 S1405010 18922253721 1.225790e+17 120.207.64.3
5 20140007 NaN 1.225790e+17 222.31.51.200
6 S1404095 13822254373 1.225790e+17 222.31.59.220
7 S1402048 13322252452 1.225790e+17 221.205.98.55
8 S1405011 18922257681 1.225790e+17 183.184.230.38
上面的df中第7和第9行數據相同,第8和第10行數據相同,去重后第7、9和8、10各保留一行數據。
2、缺失值處理:
dropna()、df.fillna() 、df.fillna(method=‘pad’)、df.fillna(method=‘bfill’)、df.fillna(df.mean())、df.fillna(df.mean()[math: physical]) 、strip()
對于缺失數據的處理方式有數據補齊、刪除對應行、不處理等方法。
【例4-6】缺失處理。
這里df是原始數據,其中2、3、5行有缺失值
Out[1]:
YHM TCSJ YWXT IP
0 S1402048 18922254812 1.225790e+17 221.205.98.55
1 S1411023 13522255003 1.225790e+17 183.184.226.205
2 S1402048 13422259938 NaN 221.205.98.55
3 20031509 18822256753 NaN 222.31.51.200
4 S1405010 18922253721 1.225790e+17 120.207.64.3
5 20140007 NaN 1.225790e+17 222.31.51.200
6 S1404095 13822254373 1.225790e+17 222.31.59.220
7 S1402048 13322252452 1.225790e+17 221.205.98.55
8 S1405011 18922257681 1.225790e+17 183.184.230.38
9 S1402048 13322252452 1.225790e+17 221.205.98.55
10 S1405011 18922257681 1.225790e+17 183.184.230.38
1. dropna() 去除數據結構中值為空的數據行
【例4-7】刪除數據為空所對應的行
from pandas import DataFrame from pandas import read_excel df = read_excel('e://rz2.xlsx') newDF=df.dropna() newDFOut[3]:
YHM TCSJ YWXT IP
0 S1402048 18922254812 1.225790e+17 221.205.98.55
1 S1411023 13522255003 1.225790e+17 183.184.226.205
4 S1405010 18922253721 1.225790e+17 120.207.64.3
6 S1404095 13822254373 1.225790e+17 222.31.59.220
7 S1402048 13322252452 1.225790e+17 221.205.98.55
8 S1405011 18922257681 1.225790e+17 183.184.230.38
9 S1402048 13322252452 1.225790e+17 221.205.98.55
10 S1405011 18922257681 1.225790e+17 183.184.230.38
例中的2、3、5行有空值NaN已經被刪除。
2. df.fillna() 用其他數值替代NaN,有些時候空數據直接刪除會影響分析的結果,可以對數據進行填補。【例4-8】使用數值或者任意字符替代缺失值
【例4-8】使用數值或者任意字符替代缺失值
from pandas import DataFrame from pandas import read_excel df = read_excel('e://rz2.xlsx') df.fillna('?')Out[4]:
YHM TCSJ YWXT IP DLSJ
0 S1402048 1.89223e+10 1.22579e+17 221.205.98.55 2014-11-04 08:44:46
1 S1411023 1.35223e+10 1.22579e+17 183.184.226.205 2014-11-04 08:45:06
2 S1402048 1.34223e+10 ? 221.205.98.55 2014-11-04 08:46:39
3 20031509 1.88223e+10 ? 222.31.51.200 2014-11-04 08:47:41
4 S1405010 1.89223e+10 1.22579e+17 120.207.64.3 2014-11-04 08:49:03
5 20140007 ? 1.22579e+17 222.31.51.200 2014-11-04 08:50:06
6 S1404095 1.38223e+10 1.22579e+17 222.31.59.220 2014-11-04 08:50:02
7 S1402048 1.33223e+10 1.22579e+17 221.205.98.55 2014-11-04 08:49:18
8 S1405011 1.89223e+10 1.22579e+17 183.184.230.38 2014-11-04 08:14:55
9 S1402048 1.33223e+10 1.22579e+17 221.205.98.55 2014-11-04 08:49:18
10 S1405011 1.89223e+10 1.22579e+17 183.184.230.38 2014-11-04 08:14:55
如2、3、5行有空,用?替代了缺失值。
3. df.fillna(method=‘pad’) 用前一個數據值替代NaN
【例4-9】用前一個數據值替代缺失值
(2、3、5行是缺失值)
Out[5]:
YHM TCSJ YWXT IP DLSJ
0 S1402048 18922254812 1.225790e+17 221.205.98.55 2014-11-04 08:44:46
1 S1411023 13522255003 1.225790e+17 183.184.226.205 2014-11-04 08:45:06
2 S1402048 13422259938 1.225790e+17 221.205.98.55 2014-11-04 08:46:39
3 20031509 18822256753 1.225790e+17 222.31.51.200 2014-11-04 08:47:41
4 S1405010 18922253721 1.225790e+17 120.207.64.3 2014-11-04 08:49:03
5 20140007 18922253721 1.225790e+17 222.31.51.200 2014-11-04 08:50:06
6 S1404095 13822254373 1.225790e+17 222.31.59.220 2014-11-04 08:50:02
7 S1402048 13322252452 1.225790e+17 221.205.98.55 2014-11-04 08:49:18
8 S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-04 08:14:55
9 S1402048 13322252452 1.225790e+17 221.205.98.55 2014-11-04 08:49:18
10 S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-04 08:14:55
4. df.fillna(method=‘bfill’) 用后一個數據值替代NaN
【例4-10】用后一個數據值替代NaN
(2、3、5行是缺失值)
Out[6]:
YHM TCSJ YWXT IP DLSJ
0 S1402048 18922254812 1.225790e+17 221.205.98.55 2014-11-04 08:44:46
1 S1411023 13522255003 1.225790e+17 183.184.226.205 2014-11-04 08:45:06
2 S1402048 13422259938 1.225790e+17 221.205.98.55 2014-11-04 08:46:39
3 20031509 18822256753 1.225790e+17 222.31.51.200 2014-11-04 08:47:41
4 S1405010 18922253721 1.225790e+17 120.207.64.3 2014-11-04 08:49:03
5 20140007 13822254373 1.225790e+17 222.31.51.200 2014-11-04 08:50:06
6 S1404095 13822254373 1.225790e+17 222.31.59.220 2014-11-04 08:50:02
7 S1402048 13322252452 1.225790e+17 221.205.98.55 2014-11-04 08:49:18
8 S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-04 08:14:55
9 S1402048 13322252452 1.225790e+17 221.205.98.55 2014-11-04 08:49:18
10 S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-04 08:14:55
5. df.fillna(df.mean()) 用平均數或者其他描述性統計量來代替NaN。
【例4-11】使用均值來填補數據。
from pandas import DataFrame from pandas import read_excel df = read_excel('e://rz2_0.xlsx') dfdf.fillna(df.mean())Out[7]:
No math physical Chinese
0 1 76 85 78
1 2 85 56 NaN
2 3 76 95 85
3 4 NaN 75 58
4 5 87 52 68
Out[8]:
No math physical Chinese
0 1 76 85 78.00
1 2 85 56 72.25
2 3 76 95 85.00
3 4 81 75 58.00
4 5 87 52 68.00
6. df.fillna(df.mean()[math: physical]) 可以選擇列進行缺失值的處理
【例4-12】為某列使用該列的均值來填補數據
from pandas import DataFrame from pandas import read_excel df = read_excel('e://rz2_0.xlsx') df.fillna(df.mean()['math':'physical'])Out[26]:
No math physical Chinese
0 1 76.0 85 78.0
1 2 85.0 56 NaN
2 3 76.0 95 85.0
3 4 NaN 75 58.0
4 5 87.0 52 68.0
Out[9]:
No math physical Chinese
0 1 76 85 78
1 2 85 56 NaN
2 3 76 95 85
3 4 81 75 58
4 5 87 52 68
7. strip():清除字符型數據左右(首尾)指定的字符,默認為空格,中間的不清除。
【例4-13】刪除字符串左右或首位指定的字符。
from pandas import DataFrame from pandas import read_excel df = read_excel('e://rz2.xlsx') newDF=df['IP'].str.strip() #因為IP是一個對象,所以先轉為str。 newDFOut[27]:
YHM TCSJ YWXT IP DLSJ
0 S1402048 18922254812.0 1.2257903137349373e+17 221.205.98.55 2014-11-04 08:44:46
1 S1411023 13522255003.0 1.2257903137349373e+17 183.184.226.205 2014-11-04 08:45:06
2 S1402048 13422259938.0 221.205.98.55 2014-11-04 08:46:39
3 20031509 18822256753.0 222.31.51.200 2014-11-04 08:47:41
4 S1405010 18922253721.0 1.2257903137349373e+17 120.207.64.3 2014-11-04 08:49:03
5 20140007 1.2257903137349373e+17 222.31.51.200 2014-11-04 08:50:06
6 S1404095 13822254373.0 1.2257903137349373e+17 222.31.59.220 2014-11-04 08:50:02
7 S1402048 13322252452.0 1.2257903137349373e+17 221.205.98.55 2014-11-04 08:49:18
8 S1405011 18922257681.0 1.2257903137349373e+17 183.184.230.38 2014-11-04 08:14:55
9 S1402048 13322252452.0 1.2257903137349373e+17 221.205.98.55 2014-11-04 08:49:18
10 S1405011 18922257681.0 1.2257903137349373e+17 183.184.230.38 2014-11-04 08:14:55
Out[10]:
0 221.205.98.55
1 183.184.226.205
2 221.205.98.55
3 222.31.51.200
4 120.207.64.3
5 222.31.51.200
6 222.31.59.220
7 221.205.98.55
8 183.184.230.38
9 221.205.98.55
10 183.184.230.38
Name: IP, dtype: object
3、特定值替換:replace(‘缺考’, 0)
df11 = df11.replace(np.nan,'[正常]') df11 = df11.replace('none',np.nan) df11 = df11.replace(' ― ',np.nan)4、刪除滿足條件元素所在的行:drop()
df = df.drop(df[].index)
#刪除價格大于1000的手機
df_s_acc = df_s.drop(df_s[df_s['價格']>=1000].index)Out[68]:
Unnamed: 0 ID值 價格 … 標簽 變更 規范日期
5566 6626 1354676 699 … 安全手機 2020/11/1 2020-11-01
5565 6625 1354673 799 … 安全手機 2020/11/1 2020-11-01
101 102 1346463 2699 … 安全手機 2020/11/11 2020-11-11
64 64 1338710 3199 … 安全手機 2020/11/11 2020-11-11
2884 3382 1352445 1499 … 安全手機 2020/11/26 2020-11-26
2892 3391 1349515 1099 … 安全手機 2020/11/26 2020-11-26
2910 3411 1349516 1299 … 安全手機 2020/11/26 2020-11-26
2844 3340 1348871 999 … 安全手機 2020/11/26 2020-11-26
4046 4845 1350884 799 … 安全手機 2020/12/1 2020-12-01
4036 4834 1350882 699 … 安全手機 2020/12/1 2020-12-01
3394 4023 1349976 799 … 安全手機 2020/12/12 2020-12-12
4740 5656 1353088 2399 … 安全手機 2020/12/22 2020-12-22
4737 5653 1353068 1999 … 安全手機 2020/12/22 2020-12-22
4048 4847 1357947 1099 … 安全手機 2021/1/1 2021-01-01
4038 4836 1357933 999 … 安全手機 2021/1/1 2021-01-01
4043 4842 1357949 1199 … 安全手機 2021/1/1 2021-01-01
Out[72]:
Unnamed: 0 ID值 價格 … 標簽 變更 規范日期
5566 6626 1354676 699 … 安全手機 2020/11/1 2020-11-01
5565 6625 1354673 799 … 安全手機 2020/11/1 2020-11-01
2844 3340 1348871 999 … 安全手機 2020/11/26 2020-11-26
4046 4845 1350884 799 … 安全手機 2020/12/1 2020-12-01
4036 4834 1350882 699 … 安全手機 2020/12/1 2020-12-01
3394 4023 1349976 799 … 安全手機 2020/12/12 2020-12-12
4038 4836 1357933 999 … 安全手機 2021/1/1 2021-01-01
也可以使用多個條件
df_clear = df.drop(df[df['x']<0.01].index) # 也可以使用多個條件 df_clear = df.drop(df[(df['x']<0.01) | (df['x']>10)].index) #刪除x小于0.01或大于10的行4.3.2 數據抽取
1. 字段抽取:抽出某列上指定位置的數據做成新的列。
slice(start,stop)
start 開始位置; stop 結束位置
【例4-14】從數據中抽出某列。
from pandas import DataFrame from pandas import read_excel df = read_excel('e://rz2.xlsx') df['TCSJ']=df['TCSJ'].astype(str) #astype()轉化類型 df['TCSJ']bands = df['TCSJ'].str.slice(0,3) bandsOut[1]:
0 18922254812
1 13522255003
2 13422259938
3 18822256753
4 18922253721
5 nan
6 13822254373
7 13322252452
8 18922257681
9 13322252452
10 18922257681
Name: TCSJ, dtype: object
Out[2]:
0 189
1 135
2 134
3 188
4 189
5 nan
6 138
7 133
8 189
9 133
10 189
Name: TCSJ, dtype: object
2. 字段拆分:按指定的字符sep,拆分已有的字符串。
split(sep,n,expand=False) sep 用于分隔字符串的分隔符n 分割后新增的列數expand 是否展開為數據框,默認為False 返回值:expand為True,返回DaraFrame;False返回Series。【原始數據】
YHM TCSJ YWXT IP DLSJ
0 S1402048 18922254812.0 1.2257903137349373e+17 221.205.98.55 2014-11-04 08:44:46
1 S1411023 13522255003.0 1.2257903137349373e+17 183.184.226.205 2014-11-04 08:45:06
2 S1402048 13422259938.0 221.205.98.55 2014-11-04 08:46:39
3 20031509 18822256753.0 222.31.51.200 2014-11-04 08:47:41
4 S1405010 18922253721.0 1.2257903137349373e+17 120.207.64.3 2014-11-04 08:49:03
5 20140007 1.2257903137349373e+17 222.31.51.200 2014-11-04 08:50:06
6 S1404095 13822254373.0 1.2257903137349373e+17 222.31.59.220 2014-11-04 08:50:02
7 S1402048 13322252452.0 1.2257903137349373e+17 221.205.98.55 2014-11-04 08:49:18
8 S1405011 18922257681.0 1.2257903137349373e+17 183.184.230.38 2014-11-04 08:14:55
9 S1402048 13322252452.0 1.2257903137349373e+17 221.205.98.55 2014-11-04 08:49:18
10 S1405011 18922257681.0 1.2257903137349373e+17 183.184.230.38 2014-11-04 08:14:55
【例4-15】拆分字符串為指定的列數
from pandas import DataFrame from pandas import read_excel df = read_excel('e://rz2.xlsx') newDF=df['IP'].str.strip() #IP先轉為str,再刪除首位空格 newDF= df['IP'].str.split('.',1,True)#按第一個"."分成兩列,1表示新增的列數 newDFOut[1]:
0 1
0 221 205.98.55
1 183 184.226.205
2 221 205.98.55
3 222 31.51.200
4 120 207.64.3
5 222 31.51.200
6 222 31.59.220
7 221 205.98.55
8 183 184.230.38
9 221 205.98.55
10 183 184.230.38
Out[2]:
IP1 IP2-4
0 221 205.98.55
1 183 184.226.205
2 221 205.98.55
3 222 31.51.200
4 120 207.64.3
5 222 31.51.200
6 222 31.59.220
7 221 205.98.55
8 183 184.230.38
9 221 205.98.55
10 183 184.230.38
3. 記錄抽取:是指根據一定的條件,對數據進行抽取。
dataframe[condition]condition:過濾條件返回值:DataFrame 常用的condition類型:比較運算:<、>、>=、<=、!=,如:df[df.comments>10000)];范圍運算:between(left,right),如:df[df.comments.between(1000,10000)];空置運算:pandas.isnull(column) ,如:df[df.title.isnull()];字符匹配:str.contains(patten,na = False) ,如:df[df.title.str.contains(‘電臺’,na=False)]邏輯運算:&(與),|(或),not(取反);如:df[(df.comments>=1000)&(df.comments<=10000)] 與 df[df.comments.between(1000,10000)]等價。【原始數據】同上
【例4-16】按條件抽取數據。
import pandas from pandas import read_excel df = read_excel('e://rz2.xlsx') df[df.TCSJ==13322252452]Out[2]:
YHM TCSJ YWXT IP
7 S1402048 13322252452 1.225790e+17 221.205.98.55
9 S1402048 13322252452 1.225790e+17 221.205.98.55
Out[3]:
YHM TCSJ YWXT IP DLSJ
0 S1402048 18922254812 1.225790e+17 221.205.98.55 2014-11-04 08:44:46
1 S1411023 13522255003 1.225790e+17 183.184.226.205 2014-11-04 08:45:06
3 20031509 18822256753 NaN 222.31.51.200 2014-11-04 08:47:41
4 S1405010 18922253721 1.225790e+17 120.207.64.3 2014-11-04 08:49:03
6 S1404095 13822254373 1.225790e+17 222.31.59.220 2014-11-04 08:50:02
8 S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-04 08:14:55
10 S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-04 08:14:55
Out[4]:
YHM TCSJ YWXT IP DLSJ
1 S1411023 13522255003 1.225790e+17 183.184.226.205 2014-11-04 08:45:06
2 S1402048 13422259938 NaN 221.205.98.55 2014-11-04 08:46:39
6 S1404095 13822254373 1.225790e+17 222.31.59.220 2014-11-04 08:50:02
Out[5]:
YHM TCSJ YWXT IP DLSJ
2 S1402048 13422259938 NaN 221.205.98.55 2014-11-04 08:46:39
3 20031509 18822256753 NaN 222.31.51.200 2014-11-04 08:47:41
Out[6]:
YHM TCSJ YWXT IP DLSJ
3 20031509 18822256753 NaN 222.31.51.200 2014-11-04 08:47:41
5 20140007 NaN 1.225790e+17 222.31.51.200 2014-11-04 08:50:06
6 S1404095 13822254373 1.225790e+17 222.31.59.220 2014-11-04 08:50:02
4. 隨機抽樣:是指隨機從數據中按照一定的行數或者比例抽取數據。
隨機抽樣函數:numpy.random.randint(start,end,num)start:范圍的開始值;end:范圍的結束值;num:抽樣個數返回值:行的索引值序列【原始數據】同上
【例4-17】隨機抽取數據。
import numpy import pandas from pandas import read_excel df = read_excel('e://rz2.xlsx’) dfOut[1]:
YHM TCSJ YWXT IP DLSJ
0 S1402048 18922254812 1.225790e+17 221.205.98.55 2014-11-4 8:44
1 S1411023 13522255003 1.225790e+17 183.184.226.205 2014-11-4 8:45
2 S1402048 13422259938 NaN 221.205.98.55 2014-11-4 8:46
3 20031509 18822256753 NaN 222.31.51.200 2014-11-4 8:47
4 S1405010 18922253721 1.225790e+17 120.207.64.3 2014-11-4 8:49
5 20140007 NaN 1.225790e+17 222.31.51.200 2014-11-4 8:50
6 S1404095 13822254373 1.225790e+17 222.31.59.220 2014-11-4 8:50
7 S1402048 13322252452 1.225790e+17 221.205.98.55 2014-11-4 8:49
8 S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-4 8:14
9 S1402048 13322252452 1.225790e+17 221.205.98.55 2014-11-4 8:49
10S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-4 8:14
Out[2]: array([8, 2, 9])
df.loc[r,:] #抽取r行數據Out[3]:
YHM TCSJ YWXT IP DLSJ
8 S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-04 08:14:55
2 S1402048 13422259938 NaN 221.205.98.55 2014-11-04 08:46:39
9 S1402048 13322252452 1.225790e+17 221.205.98.55 2014-11-04 08:49:18
PS:按照指定條件抽取數據:
1)使用index標簽選取數據:df.loc[行標簽,列標簽]
df.loc[‘a’:‘b’] #選取ab兩行之間的數據,假設a,b為行索引 df.loc[:,'TCSJ'] #選取TCSJ列的數據df.loc的第一個參數是行標簽,第二個參數為列標簽(可選參數,默認為所有列標簽),兩個參數既可以是列表也可以是單個字符,如果兩個參數都為列表則返回的是DataFrame,否則為Series。 按照指定條件抽取數據:2)使用切片位置選取數據:df.iloc[行位置,列位置] #iloc只能用數字索引,不能用索引名------(左閉右開)
df.iloc[1,1] #選取第二行,第二列的值,返回的為單個值 df.iloc[[0,2],:] #選取第一行和第三行的數據 df.iloc[0:2,:] #選取第一行到第三行(不包含)的數據 df.iloc[:,1] #選取所有記錄的第一列的值,返回的為一個Series df.iloc[1,:] #選取第一行數據,返回的為一個Series說明:loc為location的縮寫,iloc則為integer & location的縮寫。更廣義的切片方式是使用 .ix,它自動根據給到的索引類型判斷是使用位置還是標簽進行切片。即:iloc為整型索引;loc為字符串索引; ix是 iloc和 loc的合體。
Python默認的行序號是從0開始,我們稱為行位置;但實際上0開始的行我們在計數時為第1行,也稱為行號,是從1開始;有時index是被命名的,如’one’,‘two’,‘three’,‘four’或’a’,‘b’,‘c’,'d’等字符串,我們稱之為標簽。loc索引的是行號、標簽,不是行位置,如下例中df2.loc[1]索引的是第一行(行號為1),其實位置為0行;iloc索引的是位置,不能是標簽或行號;ix則三者皆可。
import pandas as pd index_loc = ['a','b'] index_iloc = [1,2] data = [[1,2,3,4],[5,6,7,8]] columns = ['one','two','three','four'] df1 = pd.DataFrame(data=data,index=index_loc,columns=columns) df2 = pd.DataFrame(data=data,index=index_iloc,columns=columns) print(df1.loc['a'])one 1
two 2
three 3
four 4
Name: a, dtype: int64
Traceback (most recent call last):
TypeError: cannot do label indexing on <class ‘pandas.core.index.Index’> with these indexers [a] of <class 'str’>
Out[0]:
one 5
two 6
three 7
four 8
Name: 2, dtype: int64
Out[1]:
one 1
two 2
three 3
four 4
Name: 1, dtype: int64
Out[2]:
one 1
two 2
three 3
four 4
Name: a, dtype: int64
Out[3]:
one 1
two 2
three 3
four 4
Name: a, dtype: int64
3)通過邏輯指針進行數據切片:df[邏輯條件]
df[df. TCSJ >= 18822256753] #單個邏輯條件 df[(df. TCSJ >=13422259938 )&(df. TCSJ < 13822254373)] #多個邏輯條件組合 這種方式獲取的數據切片都是DataFrame。 df[df.TCSJ >= 18822256753]Out[14]:
YHM TCSJ YWXT IP DLSJ
0 S1402048 18922254812 1.225790e+17 221.205.98.55 2014-11-04 08:44:46
3 20031509 18822256753 NaN 222.31.51.200 2014-11-04 08:47:41
4 S1405010 18922253721 1.225790e+17 120.207.64.3 2014-11-04 08:49:03
8 S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-04 08:14:55
10 S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-04 08:14:55
5. 字典數據:將字典數據抽取為dataframe,有三種方法。
import pandas from pandas import DataFrame #1.字典的key和value各作為一列 d1={‘a':'[1,2,3]','b':'[0,1,2]'} a1=pandas.DataFrame.from_dict(d1, orient='index’) #將字典轉化為dataframe,且key列做成了index a1.index.name = 'key' #將index的列名改成‘key’ b1=a1.reset_index() #重新增加index,并將原index做成了‘key’列 b1.columns=['key','value'] #對列重新命名為'key'和'value' b1Out[1]:
key value
0 b [0,1,2]
1 a [1,2,3]
Out[2]:
a b
0 1 4
1 2 5
2 3 6
Out[3]:
one two
0 1.0 1
1 2.0 2
2 3.0 3
3 NaN 4
也可以如下處理:
import pandas from pandas import Series import numpy as np from pandas import DataFrame d = dict( A = np.array([1,2]), B = np.array([1,2,3,4])) DataFrame(dict([(k,Series(v)) for k,v in d.items()]))Out[4]:
A B
0 1.0 1
1 2.0 2
2 NaN 3
3 NaN 4
還可以處理如下:
import numpy as np import pandas as pd my_dict = dict( A = np.array([1,2]), B = np.array([1,2,3,4]) ) df = pd.DataFrame.from_dict(my_dict,orient='index').T dfOut[5]:
A B
0 1.0 1.0
1 2.0 2.0
2 NaN 3.0
3 NaN 4.0
4.3.3 排名索引
說明:axis、ascending、inplace、by
DataFrame中的排序分為兩種,一種是對索引排序,一種是對值進行排序。
??索引排序: sort_index();值排序:sort_values();值排名:rank()
??對于索引排序,涉及到對行索引、列索引的排序,并且還涉及到是升序還是降序。函數df.sort_index(axis= , ascending= , inplace=),需要特別注意這三個參數。axis表示對行操作,還是對列操作;ascending表示升序,還是降序操作。
??對于值排序,同樣也是涉及到行、列排序問題,升序、降序排列問題。函數df.sort_values(by= , axis= , ascending= , inplace=),也需要特別注意這幾個參數,只是多了一個by操作,需要我們指明是按照哪一行或哪一列,進行排序的。
PS:(True\False)大寫
- axis=0表示對行操作,axis=1表示對列進行操作;
- ascending=True表示升序,ascending=False表示降序;
- inplace=True表示對原始DataFrame本身操作,因此不需要賦值操作,inplace=False相當于是對原始DataFrame的拷貝,之后的一些操作都是針對這個拷貝文件進行操作的,因此需要我們賦值給一個變量,保存操作后的結果。
1. 排名排序(索引排序):df.sort_index()
Series的sort_index(ascending=True)方法可以對 index 進行排序操作,ascending 參數用于控制升序或降序,默認為升序。
在 DataFrame 上,.sort_index(axis=0, by=None, ascending=True) 方法多了一個軸向的選擇參數與一個 by 參數,by 參數的作用是針對某一(些)列進行排序(不能對行使用 by 參數)。
- axis:0按照行名排序;1按照列名排序
Out[1]:
Ohio Texas California
a 0 7 2
c 6 4 8
d 3 1 5
Out[2]:
Ohio Texas California
a 0 7 2
d 3 1 5
c 6 4 8
Out[3]:
Ohio Texas California
a 0 7 2
d 3 1 5
c 6 4 8
California Ohio Texas
a 2 0 7
c 8 6 4
d 5 3 1
排名(Series.rank(method=‘average’, ascending=True))的作用與排序的不同之處在于,它會把對象的 values 替換成名次(從 1 到 n),對于平級項可以通過方法里的 method 參數來處理,method 參數有四個可選項:average, min, max, first。舉例如下:
from pandas import Series ser=Series([3,2,0,3],index=list('abcd')) serOut[8]:
a 3
b 2
c 0
d 3
ser.rank()
Out[9]:
a 3.5
b 2.0
c 1.0
d 3.5
dtype: float64
ser.rank(method=‘min’)
Out[10]:
a 3.0
b 2.0
c 1.0
d 3.0
dtype: float64
ser.rank(method=‘max’)
Out[11]:
a 4.0
b 2.0
c 1.0
d 4.0
dtype: float64
ser.rank(method=‘first’)
Out[12]:
a 3.0
b 2.0
c 1.0
d 4.0
dtype: float64
2.重新索引:.reindex(index=None,**kwargs)
Series 對象的重新索引通過其 .reindex(index=None,**kwargs) 方法實現。**kwargs 中常用的參數有兩個:method=None和fill_value=np.NaN。
ser = Series([4.5,7.2,-5.3,3.6],index=['d','b','a','c']) A = ['a','b','c','d','e'] ser.reindex(A)Out[13]:
a -5.3
b 7.2
c 3.6
d 4.5
e NaN
dtype: float64
Out[15]:
a -5.3
b 7.2
c 3.6
d 4.5
e 0.0
dtype: float64
a -5.3
b 7.2
c 3.6
d 4.5
e 4.5
dtype: float64
a -5.3
b 7.2
c 3.6
d 4.5
e 4.5
dtype: float64
- .reindex() 方法會返回一個新對象,其 index 嚴格遵循給出的參數,
- method:{‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None} 參數用于指定插值(填充)方式,當沒有給出時,默認用 fill_value 填充,值為 NaN(ffill = pad,bfill = back fill,分別指插值時向前還是向后取值)。
- DataFrame 對象的重新索引方法:.reindex(index=None,columns=None,**kwargs)僅比 Series 多了一個可選的 columns 參數,用于給列索引。用法與上例Series類似,只不過插值方法 method 參數只能應用于行,即軸axis = 0。
可不可以通過 df.T.reindex(index,method=‘**’).T 這樣的方式來實現在列上的插值呢?
答案是肯定的。
另外要注意,使用 reindex(index,method=‘**’) 的時候,index 必須是單調的,否則就會引發一個 ValueError: Must be monotonic for forward fill,比如上例中的最后一次調用,如果使用 index=[‘a’,‘b’,‘d’,‘c’] 就會報錯。
3. 值排序:df.sort_values()
1、對某一列進行升序排列(有實際意義)
df = pd.DataFrame({"A":[3,1,5,9,7],"B":[4,1,2,5,3],"C":[3,15,9,6,12],"D":[2,4,6,10,8]},index=list("acbed")) display(df)A B C D
a 3 4 3 2
c 1 1 15 4
b 5 2 9 6
e 9 5 6 10
d 7 3 12 8
Out[133]:
A B C D
c 1 1 15 4
a 3 4 3 2
b 5 2 9 6
d 7 3 12 8
e 9 5 6 10
2、 對某一行進行降序排列(實際意義不大)
df = pd.DataFrame({"A":[3,1,5,9,7],"B":[4,1,2,5,3],"C":[3,15,9,6,12],"D":[2,4,6,10,8]},index=list("acbed")) display(df)A B C D
a 3 4 3 2
c 1 1 15 4
b 5 2 9 6
e 9 5 6 10
d 7 3 12 8
Out[140]:
B A C D
a 4 3 3 2
c 1 1 15 4
b 2 5 9 6
e 5 9 6 10
d 3 7 12 8
4、sort_values()中的na_position參數
na_position參數用于設定缺失值的顯示位置,first表示缺失值顯示在最前面;last表示缺失值顯示在最后面。
df = pd.DataFrame({"A":[10,8,np.nan,2,4],"B":[1,7,5,3,8],"C":[5,2,8,4,1]},index=list("abcde")) dfOut[141]:
A B C
a 10.0 1 5
b 8.0 7 2
c NaN 5 8
d 2.0 3 4
e 4.0 8 1
Out[142]:
A B C
c NaN 5 8
d 2.0 3 4
e 4.0 8 1
b 8.0 7 2
a 10.0 1 5
Out[143]:
A B C
d 2.0 3 4
e 4.0 8 1
b 8.0 7 2
a 10.0 1 5
c NaN 5 8
5、“值排名”:rank()函數
1、rank()函數的常用參數說明
(31條消息) DataFrame(13):DataFrame的排序與排名問題_數據分析與統計學之美-CSDN博客_dataframe排序
4.3.4 數據合并
1. 記錄合并:是指兩個結構相同的數據框合并成一個數據框。也就是在一個數據框中追加另一個數據框的數據記錄。pd.concat([df1,df2])
concat([dataFrame1, dataFrame2,…])DataFrame1:數據框 返回值:DataFrame import pandas from pandas import DataFrame from pandas import read_exceldf1 = read_excel('E:\\Python\\第4章數據\\rz2.xlsx') df1df2 = read_excel('E:\\Python\\第4章數據\\rz3.xlsx') df2Out[1]:
YHM TCSJ YWXT IP
0 S1402048 18922254812 1.225790e+17 221.205.98.55
1 S1411023 13522255003 1.225790e+17 183.184.226.205
2 S1402048 13422259938 NaN 221.205.98.55
3 20031509 18822256753 NaN 222.31.51.200
4 S1405010 18922253721 1.225790e+17 120.207.64.3
5 20140007 13422259313 1.225790e+17 222.31.51.200
6 S1404095 13822254373 1.225790e+17 222.31.59.220
7 S1402048 13322252452 1.225790e+17 221.205.98.55
8 S1405011 18922257681 1.225790e+17 183.184.230.38
9 S1402048 13322252452 1.225790e+17 221.205.98.55
10 S1405011 18922257681 1.225790e+17 183.184.230.38
[11 rows x 5 columns]
Out[2]:
YHM TCSJ YWXT IP
0 S1402011 18603514812 1.225790e+17 221.205.98.55
1 S1411022 13103515003 1.225790e+17 183.184.226.205
2 S1402033 13203559930 NaN 221.205.98.55
[3 rows x 5 columns]
合并:兩個文件的數據記錄都合并到一起了,實現了數據記錄的“疊加”或者記錄順延。
df=pandas.concat([df1,df2]) dfOut[3]:
YHM TCSJ YWXT IP
0 S1402048 18922254812 1.225790e+17 221.205.98.55
1 S1411023 13522255003 1.225790e+17 183.184.226.205
2 S1402048 13422259938 NaN 221.205.98.55
3 20031509 18822256753 NaN 222.31.51.200
4 S1405010 18922253721 1.225790e+17 120.207.64.3
5 20140007 13422259313 1.225790e+17 222.31.51.200
6 S1404095 13822254373 1.225790e+17 222.31.59.220
7 S1402048 13322252452 1.225790e+17 221.205.98.55
8 S1405011 18922257681 1.225790e+17 183.184.230.38
9 S1402048 13322252452 1.225790e+17 221.205.98.55
10 S1405011 18922257681 1.225790e+17 183.184.230.38
0 S1402011 18603514812 1.225790e+17 221.205.98.55
1 S1411022 13103515003 1.225790e+17 183.184.226.205
2 S1402033 13203559930 NaN 221.205.98.55
[14 rows x 5 columns]
2. 字段合并:是指將同一個數據框中的不同的列進行合并,形成新的列。X = x1+x2+…
X = x1+x2+…x1:數據列1x2:數據列2 返回值:Series,合并后的系列,要求合并的系列長度一致。 import pandas from pandas import DataFrame from pandas import read_csvdf = read_csv('e://rz4.csv',sep=" ",names=['band','area','num']) df df = df.astype(str) tel=df['band']+df['area']+df['num'] telOut[1]:
band area num
0 189 2225 4812
1 135 2225 5003
2 134 2225 9938
3 188 2225 6753
4 189 2225 3721
5 134 2225 9313
6 138 2225 4373
7 133 2225 2452
8 189 2225 7681
Out[2]:
0 18922254812
1 13522255003
2 13422259938
3 18822256753
4 18922253721
5 13422259313
6 13822254373
7 13322252452
8 18922257681
dtype: object
3. 字段匹配:是指不同結構的數據框(兩個或以上的數據框),按照一定的條件進行合并,即追加列。merge(x,y,left_on,right_on) 外鍵連接
merge(x,y,left_on,right_on) x:第一個數據框y:第二個數據框left_on:第一個數據框的用于匹配的列right_on:第二個數據框的用于匹配的列返回值:DataFrame import pandas from pandas import DataFrame from pandas import read_excel df1 = read_excel('e://rz2.xlsx',sheetname='Sheet3') df1Out[1]:
id band num
0 1 130 123
1 2 131 124
2 4 133 125
3 5 134 126
Out[2]:
id band area
0 1 130 351
1 2 131 352
2 3 132 353
3 4 133 354
4 5 134 355
5 5 135 356
Out[3]:
id band_x num band_y area
0 1 130 123 130 351
1 2 131 124 131 352
2 4 133 125 133 354
3 5 134 126 134 355
4 5 134 126 135 356
4.3.5 數據計算
1. 簡單計算:通過對各字段進行加、減、乘、除等四則算術運算,計算出的結果作為新的字段。
| 1 | 123 | 159 |
| 2 | 124 | 753 |
| 3 | 125 | 456 |
| 4 | 126 | 852 |
| 1 | 123 | 159 | 19557 |
| 2 | 124 | 753 | 93372 |
| 3 | 125 | 456 | 57000 |
| 4 | 126 | 852 | 107352 |
Out[1]:
id band num price
0 1 130 123 159
1 2 131 124 753
2 3 132 125 456
3 4 133 126 852
Out[2]:
0 19557
1 93372
2 57000
3 107352
dtype: int64
Out[3]:
id band num price result
0 1 130 123 159 19557
1 2 131 124 753 93372
2 3 132 125 456 57000
3 4 133 126 852 107352
2. 數據標準化:是指將數據按照比例縮放,使之落入特定的區間,一般使用0-1標準化。X*=(x-min)/(max-min)
from pandas import read_csv df = read_csv('e://rz2.csv',sep=',') dfOut[1]:
id band num price
0 1 130 123 159
1 2 131 124 753
2 3 132 125 456
3 4 133 126 852
Out[2]:
0 0.000000
1 0.857143
2 0.428571
3 1.000000
Name: price, dtype: float64
4.3.6 數據分組
bins = [0,180,210,240,270,np.inf] #np.inf 是無窮大 labels=["差","及格", "中","良","優"] df3["等級"]=pd.cut(df3.總分,bins,right=False,labels=labels)說明:pd.cut(series,bins,right=True,labels=NULL)
數據分組:根據數據分析對象的特征,按照一定的數據指標,把數據劃分為不同的區間來進行研究,以揭示其內在的聯系和規律性。簡單來說:就是新增一列,將原來的數據按照其性質歸入新的類別中。
cut(series,bins,right=True,labels=NULL) series 需要分組的數據 bins 分組的依據數據 right 分組的時候右邊是否閉合 labels 分組的自定義標簽,可以不自定義bins
import pandas #from pandas import DataFrame from pandas import read_csvdf = read_csv('e://rz2.csv',sep=',') dfOut[1]:
id band num price
0 1 130 123 159
1 2 131 124 753
2 3 132 125 456
3 4 133 126 852
Out[2]:
0 (158, 500]
1 (500, 853]
2 (158, 500]
3 (500, 853]
Name: price, dtype: category
Categories (2, object): [(158, 500] < (500, 853]]
Out[3]:
0 [158, 500)
1 [500, 853)
2 [158, 500)
3 [500, 853)
Name: price, dtype: category
Categories (2, object): [[158, 500) < [500, 853)]
right 值:分組的時候右邊是否閉合
labels
pa=pandas.cut(df.price,bins,right=False,labels=labels) paOut[5]: 0 500以下1 500以上2 500以下3 500以上Name: price, dtype: categoryCategories (2, object): [500以下 < 500以上]df['label']=pandas.cut(df.price,bins,right=False,labels=labels) dfOut[6]: id band num price label0 1 130 123 159 500以下1 2 131 124 753 500以上2 3 132 125 456 500以下3 4 133 126 852 500以上4.3.7 日期處理
1. 日期轉換:是指將字符型的日期格式轉換為日期格式數據的過程。
to_datetime(dateString,format)format格式: %Y:年份 %m:月份 %d:日期 %H:小時 %M:分鐘 %S:秒【例4-21】to_datetime(df.注冊時間,format=’%Y/%m/%d’)。
from pandas import read_csv from pandas import to_datetime df = read_csv('e://rz3.csv',sep=',',encoding='utf8') dfOut[1]:
num price year month date
0 123 159 2016 1 2016/6/1
1 124 753 2016 2 2016/6/2
2 125 456 2016 3 2016/6/3
3 126 852 2016 4 2016/6/4
4 127 210 2016 5 2016/6/5
5 115 299 2016 6 2016/6/6
6 102 699 2016 7 2016/6/7
7 201 599 2016 8 2016/6/8
8 154 199 2016 9 2016/6/9
9 142 899 2016 10 2016/6/10
Out[2]:
0 2016-06-01
1 2016-06-02
2 2016-06-03
3 2016-06-04
4 2016-06-05
5 2016-06-06
6 2016-06-07
7 2016-06-08
8 2016-06-09
9 2016-06-10
Name: date, dtype: datetime64[ns]
注意csv的格式是否是utf8格式,否則會報錯。另外,csv里date的格式是文本(字符串)格式。
2. 日期格式化:是指將日期型的數據按照給定的格式轉化為字符型的數據。
apply(lambda x:處理邏輯) datetime.strftime(x,format)【例4-22】日期型數據轉化為字符型數據。
df_dt = to_datetime(df.date,format="%Y/%m/%d") df_dt_str=df_dt.apply(lambda x: datetime.strftime(x,"%Y/%m/%d"))from pandas import read_csv from pandas import to_datetime from datetime import datetime df = read_csv('e://rz3.csv',sep=',',encoding='utf8') df_dt = to_datetime(df.date,format="%Y/%m/%d") df_dt_str=df_dt.apply(lambda x: datetime.strftime(x,"%Y/%m/%d")) #apply見后注 df_dt_strOut[1]:
0 2016/06/01
1 2016/06/02
2 2016/06/03
3 2016/06/04
4 2016/06/05
5 2016/06/06
6 2016/06/07
7 2016/06/08
8 2016/06/09
9 2016/06/10
Name: date, dtype: object
注意:當希望將函數f應用到DataFrame 對象的行或列時,可以使用.apply(f, axis=0, args=(), **kwds) 方法,axis=0表示按列運算,axis=1時表示按行運算。如:
from pandas import DataFrame df=DataFrame({'ohio':[1,3,6],'texas':[1,4,5],'california':[2,5,8]},index=['a','c','d']) dfOut[1]:
california ohio texas
a 2 1 1
c 5 3 4
d 8 6 5
Out[2]:
california 6
ohio 5
texas 4
dtype: int64
Out[3]:
a 1
c 2
d 3
dtype: int64
3. 日期抽取:是指從日期格式里面抽取出需要的部分屬性
Data_dt.dt.property
| minute | 1-60分,從1開始到60 |
| hour | 1-24小時,從1開始到24 |
| day | 1-31日,一個月中第幾天,從1開始到31 |
| month | 1-12月,從1開始到12 |
| year | 年份 |
| weekday | 1-7,一周中的第幾天,從1開始,最大為7(已改為0-6) |
【例4-23】對日期進行抽取。
from pandas import read_csv; from pandas import to_datetime; df = read_csv('e://rz3.csv', sep=',', encoding='utf8') dfOut[1]:
num price year month date
0 123 159 2016 1 2016/6/1
1 124 753 2016 2 2016/6/2
2 125 456 2016 3 2016/6/3
3 126 852 2016 4 2016/6/4
4 127 210 2016 5 2016/6/5
5 115 299 2016 6 2016/6/6
6 102 699 2016 7 2016/6/7
7 201 599 2016 8 2016/6/8
8 154 199 2016 9 2016/6/9
9 142 899 2016 10 2016/6/10
Out[2]:
0 2016-06-01
1 2016-06-02
2 2016-06-03
3 2016-06-04
4 2016-06-05
5 2016-06-06
6 2016-06-07
7 2016-06-08
8 2016-06-09
9 2016-06-10
Name: date, dtype: datetime64[ns]
Out[3]:
0 2016
1 2016
2 2016
3 2016
4 2016
5 2016
6 2016
7 2016
8 2016
9 2016
Name: date, dtype: int64
Out[4]:
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
Name: date, dtype: int64
4. 日期判斷:
Python 時間比較大小 并從dataframe中提取滿足時間條件的量_siml142857的博客-CSDN博客_dataframe 比較大小
5.日期增長:
python 當前時間減一天-菜鳥筆記
4、數據分析
4.4.1 基本統計:describe
如果分組字段是離散值,則直接使用groupby分組統計
基本統計分析:又叫描述性統計分析,一般統計某個變量的最小值、第一個四分位值、中值、第三個四分位值、以及最大值。
describe() 描述性統計分析函數
(22條消息) Python對表的行列求和_OlivierJ的博客-CSDN博客_python 列求和
4.4.2 分組分析:groupby(離散值分組)
如果分組字段是連續值,則先進行離散化(cut),然后再使用groupby分組
分組分析:是指根據分組字段將分析對象劃分成不同的部分,以進行對比分析各組之間的差異性的一種分析方法。
常用的統計指標:計數、求和、平均值 常用形式: df.groupby(by=['分類1','分類2',...])['被統計的列'].agg({列別名1:統計函數1,列別名2:統計函數2,…})by 用于分組的列[ ] 用于統計的列.agg 統計別名顯示統計值的名稱,統計函數用于統計數據size 計數sum 求和mean 均值 from pandas import read_excel df = read_excel('e:\\rz4.xlsx') dfOut[1]:
學號 班級 姓名 性別 英語 體育 軍訓 數分 高代 解幾 計算機
0 2308024241 23080242 成龍 男 76 78 77 40 23 60 89
1 2308024244 23080242 周怡 女 66 91 75 47 47 44 82
2 2308024251 23080242 張波 男 85 81 75 45 45 60 80
3 2308024249 23080242 朱浩 男 65 50 80 72 62 71 82
4 2308024219 23080242 封印 女 73 88 92 61 47 46 83
5 2308024201 23080242 遲培 男 60 50 89 71 76 71 82
6 2308024347 23080243 李華 女 67 61 84 61 65 78 83
7 2308024307 23080243 陳田 男 76 79 86 69 40 69 82
8 2308024326 23080243 余皓 男 66 67 85 65 61 71 95
9 2308024320 23080243 李嘉 女 62 60 90 60 67 77 95
10 2308024342 23080243 李上初 男 76 90 84 60 66 60 82
11 2308024310 23080243 郭竇 女 79 67 84 64 64 79 85
12 2308024435 23080244 姜毅濤 男 77 71 87 61 73 76 82
13 2308024432 23080244 趙宇 男 74 74 88 68 70 71 85
14 2308024446 23080244 周路 女 76 80 77 61 74 80 85
15 2308024421 23080244 林建祥 男 72 72 81 63 90 75 85
16 2308024433 23080244 李大強 男 79 76 77 78 70 70 89
17 2308024428 23080244 李側通 男 64 96 91 69 60 77 83
18 2308024402 23080244 王慧 女 73 74 93 70 71 75 88
19 2308024422 23080244 李曉亮 男 85 60 85 72 72 83 89
總分 人數 平均值 方差 標準差 最高分 最低分
班級 性別
23080242 女 167 2 83.500000 144.500000 12.020815 92 75
男 321 4 80.250000 38.250000 6.184658 89 75
23080243 女 258 3 86.000000 12.000000 3.464102 90 84
男 255 3 85.000000 1.000000 1.000000 86 84
23080244 女 170 2 85.000000 128.000000 11.313708 93 77
男 509 6 84.833333 25.766667 5.076088 91 77
4.4.3 分布分析:cut+groupby(連續值分組)
分組分析:是指根據分組字段將分析對象劃分成不同的部分,以進行對比分析各組之間的差異性的一種分析方法。
常用的統計指標:計數、求和、平均值常用形式:df.groupby(by=['分類1','分類2',...])['被統計的列'].agg({列別名1:統計函數1,列別名2:統計函數2,…}) by 用于分組的列 [ ] 用于統計的列 .agg 統計別名顯示統計值的名稱,統計函數用于統計數據 size 計數 sum 求和 mean 均值 import numpy import pandas from pandas import read_excel df = read_excel('e:\\rz4.xlsx') dfOut[1]:
學號 班級 姓名 性別 英語 體育 軍訓 數分 高代 解幾 計算機 總分
0 2308024241 23080242 成龍 男 76 78 77 40 23 60 89 443
1 2308024244 23080242 周怡 女 66 91 75 47 47 44 82 452
2 2308024251 23080242 張波 男 85 81 75 45 45 60 80 471
3 2308024249 23080242 朱浩 男 65 50 80 72 62 71 82 482
4 2308024219 23080242 封印 女 73 88 92 61 47 46 83 490
5 2308024201 23080242 遲培 男 60 50 89 71 76 71 82 499
6 2308024347 23080243 李華 女 67 61 84 61 65 78 83 499
7 2308024307 23080243 陳田 男 76 79 86 69 40 69 82 501
8 2308024326 23080243 余皓 男 66 67 85 65 61 71 95 510
9 2308024320 23080243 李嘉 女 62 60 90 60 67 77 95 511
10 2308024342 23080243 李上初 男 76 90 84 60 66 60 82 518
11 2308024310 23080243 郭竇 女 79 67 84 64 64 79 85 522
12 2308024435 23080244 姜毅濤 男 77 71 87 61 73 76 82 527
13 2308024432 23080244 趙宇 男 74 74 88 68 70 71 85 530
14 2308024446 23080244 周路 女 76 80 77 61 74 80 85 533
15 2308024421 23080244 林建祥 男 72 72 81 63 90 75 85 538
16 2308024433 23080244 李大強 男 79 76 77 78 70 70 89 539
17 2308024428 23080244 李側通 男 64 96 91 69 60 77 83 540
18 2308024402 23080244 王慧 女 73 74 93 70 71 75 88 544
19 2308024422 23080244 李曉亮 男 85 60 85 72 72 83 89 546
Out[5]: [‘450及其以下’, ‘450到500’, ‘500及其以上’]
bins = [min(df.總分)-1,450,500,max(df.總分)+1] #將數據分成三段 binsOut[3]: [442, 450, 500, 547]
總分分層 = pandas.cut(df.總分,bins,labels=labels) 總分分層Out[7]:
0 450及其以下
1 450到500
2 450到500
3 450到500
4 450到500
5 450到500
6 450到500
7 500及其以上
8 500及其以上
9 500及其以上
10 500及其以上
11 500及其以上
12 500及其以上
13 500及其以上
14 500及其以上
15 500及其以上
16 500及其以上
17 500及其以上
18 500及其以上
19 500及其以上
Name: 總分, dtype: category
Categories (3, object): [450及其以下 < 450到500 < 500及其以上]
Out8]:
學號 班級 姓名 性別 英語 體育 軍訓 數分 高代 解幾 計算機基礎 總分 總分分層
0 2308024241 23080242 成龍 男 76 78 77 40 23 60 89 443 450及其以下
1 2308024244 23080242 周怡 女 66 91 75 47 47 44 82 452 450到500
2 2308024251 23080242 張波 男 85 81 75 45 45 60 80 471 450到500
3 2308024249 23080242 朱浩 男 65 50 80 72 62 71 82 482 450到500
4 2308024219 23080242 封印 女 73 88 92 61 47 46 83 490 450到500
5 2308024201 23080242 遲培 男 60 50 89 71 76 71 82 499 450到500
6 2308024347 23080243 李華 女 67 61 84 61 65 78 83 499 450到500
7 2308024307 23080243 陳田 男 76 79 86 69 40 69 82 501 500及其以上
8 2308024326 23080243 余皓 男 66 67 85 65 61 71 95 510 500及其以上
9 2308024320 23080243 李嘉 女 62 60 90 60 67 77 95 511 500及其以上
10 2308024342 23080243 李上初 男 76 90 84 60 66 60 82 518 500及其以上
11 2308024310 23080243 郭竇 女 79 67 84 64 64 79 85 522 500及其以上
12 2308024435 23080244 姜毅濤 男 77 71 87 61 73 76 82 527 500及其以上
13 2308024432 23080244 趙宇 男 74 74 88 68 70 71 85 530 500及其以上
14 2308024446 23080244 周路 女 76 80 77 61 74 80 85 533 500及其以上
15 2308024421 23080244 林建祥 男 72 72 81 63 90 75 85 538 500及其以上
16 2308024433 23080244 李大強 男 79 76 77 78 70 70 89 539 500及其以上
17 2308024428 23080244 李側通 男 64 96 91 69 60 77 83 540 500及其以上
18 2308024402 23080244 王慧 女 73 74 93 70 71 75 88 544 500及其以上
19 2308024422 23080244 李曉亮 男 85 60 85 72 72 83 89 546 500及其以上
Out[9]:
人數
總分分層
450及其以下 1
450到500 6
500及其以上 13
4.4.4 交叉分析:pivot_table(數據透視表)
交叉分析:通常用于分析兩個或兩個以上分組變量之間的關系,以交叉表形式進行變量間關系的對比分析。一般分為:定量、定量分組交叉;定量、定性分組交叉;定性、定性分組交叉。
pivot_table(values,index,columns,aggfunc,fill_value)values 數據透視表中的值 index 數據透視表中的行 columns 數據透視表中的列 aggfunc 統計函數 fill_value NA值的統一替換 import numpy import pandas from pandas import read_excel from pandas import pivot_table #在spyder下也可以不導入df = read_excel('e:\\rz4.xlsx') bins = [min(df.總分)-1,450,500,max(df.總分)+1] labels=['450及其以下','450到500','500及其以上'] 總分分層 = pandas.cut(df.總分,bins,labels=labels) df['總分分層']= 總分分層 df.pivot_table(values=['總分'],index=['總分分層’],columns=['性別'],aggfunc=[numpy.size,numpy.mean])Out[1]:
size mean
總分 總分
性別 女 男 女 男
總分分層
450及其以下 NaN 1 NaN 443.000000
450到500 3 3 480.333333 484.000000
500及其以上 4 9 527.500000 527.666667
Out[2]:
size mean
總分 總分
性別 女 男 女 男
總分分層
450及其以下 0 1 0.000000 443.000000
450到500 3 3 480.333333 484.000000
500及其以上 4 9 527.500000 527.666667s
4.4.5 結構分析:pivot_table+sum+div(查比重)
結構分析:是在分組的基礎上,計算各組成部分所占的比重,進而分析總體的內部特征的一種分析方法。
axis參數說明:0表示列;1表示行。
#假設要計算班級團體總分情況 import numpy import pandas from pandas import read_excel from pandas import pivot_table #在spyder下也可以不導入 df = read_excel('e:\\rz4.xlsx') df_pt = df.pivot_table(values=['總分’],index=['班級'],columns=['性別’],aggfunc=[numpy.sum]) df_ptOut[1]:
sum
總分
性別 女 男
班級
23080242 942 1895
23080243 1532 1529
23080244 1077 3220
Out[3]:
性別
sum 總分 女 3551
男 6644
dtype: int64
Out[5]:
sum
總分
性別 女 男
班級
23080242 0.332041 0.667959
23080243 0.500490 0.499510
23080244 0.250640 0.749360
Out[2]:
性別
sum 總分 女 3551
男 6644
dtype: int64
Out[6]:
sum
總分
性別 女 男
班級
23080242 0.265277 0.285220
23080243 0.431428 0.230132
23080244 0.303295 0.484648
Out[4]:
班級
23080242 2837
23080243 3061
23080244 4297
dtype: int64
4.4.6 相關分析:corr(一維、二維)
相關分析: 是研究現象之間是否存在某種依存關系,并對具體有依存關系的現象探討其相關方向以及相關程度,是研究隨機變量之間的相關關系的一種統計方法。
相關系數: 可以用來描述定量變量之間的關系
| 0<=|r|<0.3 | 低度相關 |
| 0.3<=|r|<0.8 | 中度相關 |
| 0.8<=|r|<=1 | 高度相關 |
相關分析函數:
DataFrame.corr()Series.corr(other)如果由數據框調用corr方法,那么將會計算每列兩兩之間的相似度。如果由序列調用corr方法,那么只是計算該序列與傳入的序列之間的相關度。
返回值:
DataFrame調用 返回DataFrameSeries調用 返回一個數值型,大小為相關度舉例
#一維 df3.英語.corr(df3.高代) Out[9]: -0.12524513810989527 df3.解幾.corr(df3.高代) Out[11]: 0.6132805268443008#二維 df3.corr() Out[13]: 學號 班級 英語 ... 解幾 計算機基礎 總分 學號 1.000000 0.982617 0.287492 ... 0.636150 0.211420 0.843040 班級 0.982617 1.000000 0.257248 ... 0.671301 0.251736 0.901960 英語 0.287492 0.257248 1.000000 ... 0.027452 -0.119039 0.167927 體育 0.130255 0.088482 0.244323 ... -0.526276 -0.266896 -0.067810 軍訓 0.124176 0.248652 -0.335015 ... 0.249299 0.148933 0.446614 數分 0.435493 0.517529 -0.129588 ... 0.544394 0.123399 0.732137 高代 0.602636 0.635006 -0.125245 ... 0.613281 0.096979 0.779466 解幾 0.636150 0.671301 0.027452 ... 1.000000 0.305934 0.705506 計算機基礎 0.211420 0.251736 -0.119039 ... 0.305934 1.000000 0.223004 總分 0.843040 0.901960 0.167927 ... 0.705506 0.223004 1.0000005、數據可視化
相關注意
4.4Python數據處理篇之Matplotlib系列(四)—plt.bar()與plt.barh條形圖
拉出長畫布
fig = plt.figure(figsize=(12,4)) # 設置畫布大小調整標簽字體大小
plt.tick_params(axis='x', labelsize=8) # 設置x軸標簽大小標簽旋轉
plt.bar(df['sport_type'], df['score'])4.5.1 餅圖:plt.pie(gb2.人數,labels=gb2.index,autopct=‘%.2f%%’,colors=[‘b’,‘pink’,(0.5,0.8,0.3)],explode=[0,0,0,0,0.1])
餅圖(Pie Graph):又稱圓形圖,是一個劃分為幾個扇形的圓形統計圖,它能夠直觀的反映個體與總體的比例關系
pie(x,labels,colors,explode,autopct)x 進行繪圖的序列 labels 餅圖的各部分標簽 colors 餅圖的各部分顏色,使用GRB標顏色 explode 需要突出的塊狀序列 autopct 餅圖占比的顯示格式,%.2f:保留兩位小數 import numpy as np import pandas as pd import matplotlib.pyplot as pltdf = pd.read_excel(r'E:\Python\第4章數據\rz4.xlsx') dfgb=df.groupby(by=['班級'])['學號'].agg([('人數',np.size)]) plt.pie(gb.人數,labels=gb.index,autopct='%.2f%%',colors=['b','pink',(0.5,0.8,0.3)],explode=[0,0.2,0])練習
df2= pd.read_excel(r'E:\Python\第4章數據\09電動1.xls') df2['C語言程序設計']=pd.cut(df2.C語言程序設計,bins=[0,60,70,80,90,101],right=False,labels=['不及格','及格','中等','良好','優秀']) #right=False 控制左閉右開 gb2=df2.groupby(by=['C語言程序設計'])['學號'].agg([('人數',np.size)]).fillna(0) #fillna(0)填充空值 plt.pie(gb2.人數,labels=gb2.index,autopct='%.2f%%',colors=['b','pink',(0.5,0.8,0.3)],explode=[0,0,0,0,0.1]) plt.rcParams['font.sans-serif']=['SimHei'] #字體 plt.rcParams['font.size']=30 #字體大小 plt.rcParams['figure.figsize']=[6,6] #正圓-
plt.rcParams,顯示設值字體的東西
plt.rcParamsplt.rcParams['font.sans-serif'] Out[43]: ['DejaVu Sans','Bitstream Vera Sans','Computer Modern Sans Serif','Lucida Grande','Verdana','Geneva','Lucid','Arial','Helvetica','Avant Garde','sans-serif']plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['font.sans-serif']=['SimHei','...','...'] #沒有的往后找
4.5.2 散點圖:plt.plot(df.高代,df.數分,‘o’,color=‘pink’)
散點圖(scatter diagram):是以一個變量為橫坐標,另一個變量為縱坐標,利用散點(坐標點)的分布形態反映變量關系的一種圖形。
plot(x,y, '. ',color=(r,g,b)) plt.xlabel('x軸坐標') plt.ylabel('y軸坐標') plt.grid(Ture) x、y X軸和Y軸的序列 '. '、'o' 小點還是大點 Color 散點圖的顏色,可以用rgb定義,也可以用英文字母定義 RGB顏色的設置:(red,green,blue) 紅綠藍顏色組成 df = pd.read_excel(r'E:\Python\第4章數據\rz4.xlsx') dfgb=df.groupby(by=['班級'])['學號'].agg([('人數',np.size)]) plt.plot(df.英語,df.數分,'.',color='g') plt.xlabel('英語') plt.xlabel('數分') plt.plot(df.高代,df.數分,'o',color='pink') plt.plot(df.高代,df.數分,'o',color='pink') plt.plot(df.高代,df.數分,'-',color='pink') #連線4.5.3 折線圖:plt.plot(df.學號,df.總分,‘-’,color=‘r’)
| - | 連續的曲線 |
| — | 連續的虛線 |
| -. | 連續的用帶點的曲線 |
| : | 由點連成的曲線 |
| . | 小點,散點圖 |
| o | 大點,散點圖 |
| , | 像素點(更小的點)的散點圖 |
| * | 五角星的點散點圖 |
| > | 右角標記散點圖 |
| < | 左角標記散點圖 |
| 1(2,3,4) | 傘形上(下左右)標記散點圖 |
| s | 正方形標記散點圖 |
| p | 五角星標記散點圖 |
| v | 下三角標記散點圖 |
| ^ | 上三角標記散點圖 |
| h | 多邊形標記散點圖 |
| d | 鉆石標記散點圖 |
學號 班級 姓名 性別 英語 體育 軍訓 數分 高代 解幾 計算機基礎 總分
0 2308024241 23080242 成龍 男 76 78 77 40 23 60 89 443
1 2308024244 23080242 周怡 女 66 91 75 47 47 44 82 452
2 2308024251 23080242 張波 男 85 81 75 45 45 60 80 471
3 2308024249 23080242 朱浩 男 65 50 80 72 62 71 82 482
4 2308024219 23080242 封印 女 73 88 92 61 47 46 83 490
5 2308024201 23080242 遲培 男 60 50 89 71 76 71 82 499
6 2308024347 23080243 李華 女 67 61 84 61 65 78 83 499
7 2308024307 23080243 陳田 男 76 79 86 69 40 69 82 501
8 2308024326 23080243 余皓 男 66 67 85 65 61 71 95 510
9 2308024320 23080243 李嘉 女 62 60 90 60 67 77 95 511
10 2308024342 23080243 李上初 男 76 90 84 60 66 60 82 518
11 2308024310 23080243 郭竇 女 79 67 84 64 64 79 85 522
12 2308024435 23080244 姜毅濤 男 77 71 87 61 73 76 82 527
13 2308024432 23080244 趙宇 男 74 74 88 68 70 71 85 530
14 2308024446 23080244 周路 女 76 80 77 61 74 80 85 533
15 2308024421 23080244 林建祥 男 72 72 81 63 90 75 85 538
16 2308024433 23080244 李大強 男 79 76 77 78 70 70 89 539
17 2308024428 23080244 李側通 男 64 96 91 69 60 77 83 540
18 2308024402 23080244 王慧 女 73 74 93 70 71 75 88 544
19 2308024422 23080244 李曉亮 男 85 60 85 72 72 83 89 546
4.5.4 柱形圖:plt.bar(df.學號后三位,df.總分,width=1,color=[‘r’,‘b’])
柱形圖用于顯示一段時間內的數據變化或顯示各項之間的比較情況,是一種單位長度的長方形,根據數據大小繪制的統計圖,用來比較兩個或以上的數據(時間或類別)。
bar(left,height,width,color)barh(bottom,width,height,color)left x軸的位置序列,一般采用arange函數產生一個序列height y軸的數值序列,也就是柱形圖高度,一般就是我們需要展示的數據width 柱形圖的寬度,一般設置為1即可color 柱形圖填充顏色 df['學號后三位']=df.學號.astype(str).str.slice(-3,) plt.bar(df.學號后三位,df.總分,width=1,color=['r','b']) #柱形圖 plt.xticks(rotation=60)plt.barh(df.學號后三位,df.總分,0.6,color=['r','b']) #條形圖
bar
barh
4.5.5 直方圖:plt.hist(df2.C語言程序設計,bins=10,color=‘g’,cumulative=True)
直方圖(Histogram):是用一系列等寬不等高的長方形來繪制,寬度表示數據范圍的間隔,高度表示在給定間隔內數據出現的頻數,變化的高度形態表示數據的分布情況。
用來查看數據的頻率
hist(x,color,bins,cumulative=False)x 需要進行繪制的向量color 直方圖填充的顏色bins 設置直方圖的分組個數cumulative 設置是否累積計數,默認是False df2= pd.read_excel(r'E:\Python\第4章數據\09電動1.xls') plt.hist(df2.C語言程序設計,bins=10,color='g',cumulative=False) plt.hist(df2.C語言程序設計,bins=10,color='g',cumulative=True)
cumulative=False
cumulative=True
bins=20
這是我的線上筆記,希望對你有所幫助;你的點贊收藏,是我堅持的最大動力
【Python學習筆記—保姆版】Notion筆記
總結
以上是生活随笔為你收集整理的【Python学习笔记—保姆版】第四章—关于Pandas、数据准备、数据处理、数据分析、数据可视化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android初学者_初学者:如何在An
- 下一篇: Python实现艺术风格绘图