❶ python中針對缺失值有哪些高級插補方法
1,迭代器協議:對象需要提供next()方法,它要麼返回迭代中的下一項,要麼就引起一個StopIteration異常,以終止迭代。
2,可迭代對象:實現了迭代器協議對象。list、tuple、dict都是Iterable(可迭代對象),但不是iteration(迭代器對象)。但可以使用內建函數iter(),把這些都變成iteration(迭代器對象)。
❷ Python數據分析案例-葯店銷售數據分析
最近學習了Python數據分析的一些基礎知識,就找了一個葯品數據分析的小項目來練一下手。
數據分析的目的:
本篇文章中,假設以朝陽醫院2018年銷售數據為例,目的是了解朝陽醫院在2018年裡的銷售情況,通過對朝陽區醫院的葯品銷售數據的分析,了解朝陽醫院的患者的月均消費次數,月均消費金額、客單價以及消費趨勢、需求量前幾位的葯品等。
數據分析基本過程包括:獲取數據、數據清洗、構建模型、數據可視化以及消費趨勢分析。
數據准備
數據是存在Excel中的,可以使用pandas的Excel文件讀取函數將數據讀取到內存中,這里需要注意的是文件名和Excel中的sheet頁的名字。讀取完數據後可以對數據進行預覽和查看一些基本信息。
獲取數據:朝陽醫院2018年銷售數據.xlsx(非真實數據) 提取碼: 6xm2
導入原始數據
數據准備
數據是存在Excel中的,可以使用pandas的Excel文件讀取函數將數據讀取到內存中,這里需要注意的是文件名和Excel中的sheet頁的名字。讀取完數據後可以對數據進行預覽和查看一些基本信息。
獲取數據:朝陽醫院2018年銷售數據.xlsx(非真實數據) 提取碼: 6xm2
導入原始數據
數據清洗
數據清洗過程包括:選擇子集、列名重命名、缺失數據處理、數據類型轉換、數據排序及異常值處理
(1)選擇子集
在我們獲取到的數據中,可能數據量非常龐大,並不是每一列都有價值都需要分析,這時候就需要從整個數據中選取合適的子集進行分析,這樣能從數據中獲取最大價值。在本次案例中不需要選取子集,暫時可以忽略這一步。
(2)列重命名
在數據分析過程中,有些列名和數據容易混淆或產生歧義,不利於數據分析,這時候需要把列名換成容易理解的名稱,可以採用rename函數實現:
(3)缺失值處理
獲取的數據中很有可能存在缺失值,通過查看基本信息可以推測「購葯時間」和「社保卡號」這兩列存在缺失值,如果不處理這些缺失值會干擾後面的數據分析結果。
缺失數據常用的處理方式為刪除含有缺失數據的記錄或者利用演算法去補全缺失數據。
在本次案例中為求方便,直接使用dropna函數刪除缺失數據,具體如下:
(4)數據類型轉換
在導入數據時為了防止導入不進來,會強制所有數據都是object類型,但實際數據分析過程中「銷售數量」,「應收金額」,「實收金額」,這些列需要浮點型(float)數據,「銷售時間」需要改成時間格式,因此需要對數據類型進行轉換。
可以使用astype()函數轉為浮點型數據:
在「銷售時間」這一列數據中存在星期這樣的數據,但在數據分析過程中不需要用到,因此要把銷售時間列中日期和星期使用split函數進行分割,分割後的時間,返回的是Series數據類型:
此時時間是沒有按順序排列的,所以還是需要排序一下,排序之後索引會被打亂,所以也需要重置一下索引。
其中by:表示按哪一列進行排序,ascending=True表示升序排列,ascending=False表示降序排列
先查看數據的描述統計信息
通過描述統計信息可以看到,「銷售數量」、「應收金額」、「實收金額」這三列數據的最小值出現了負數,這明顯不符合常理,數據中存在異常值的干擾,因此要對數據進一步處理,以排除異常值的影響:
數據清洗完成後,需要利用數據構建模型(就是計算相應的業務指標),並用可視化的方式呈現結果。
月均消費次數 = 總消費次數 / 月份數(同一天內,同一個人所有消費算作一次消費)
月均消費金額 = 總消費金額 / 月份數
客單價 = 總消費金額 / 總消費次數
從結果可以看出,每天消費總額差異較大,除了個別天出現比較大筆的消費,大部分人消費情況維持在1000-2000元以內。
接下來,我銷售時間先聚合再按月分組進行分析:
結果顯示,7月消費金額最少,這是因為7月份的數據不完整,所以不具參考價值。
1月、4月、5月和6月的月消費金額差異不大.
2月和3月的消費金額迅速降低,這可能是2月和3月處於春節期間,大部分人都回家過年的原因。
d. 分析葯品銷售情況
對「商品名稱」和「銷售數量」這兩列數據進行聚合為Series形式,方便後面統計,並按降序排序:
截取銷售數量最多的前十種葯品,並用條形圖展示結果:
結論:對於銷售量排在前幾位的葯品,醫院應該時刻關注,保證葯品不會短缺而影響患者。得到銷售數量最多的前十種葯品的信息,這些信息也會有助於加強醫院對葯房的管理。
每天的消費金額分布情況:一橫軸為時間,縱軸為實收金額畫散點圖。
結論: 從散點圖可以看出,每天消費金額在500以下的占絕大多數,個別天存在消費金額很大的情況。
</article>
❸ python pandas 怎麼填補某一列的缺失值
df["你要填補的列名"].fillna(「填補的值」)
df為你數據框名稱 ,你的不一定是df
❹ 缺失值處理
缺失數據
1 缺失值的統計和刪除
1.1 缺失信息的統計
缺失數據可以使用 isna 或 isnull (兩個函數沒有區別)來查看每個單元格是否缺失,通過和 sum 的組合可以計算出每列缺失值的比例。
如果想要查看某一列缺失或者非缺失的行,可以利用 Series 上的 isna 或者 notna 進行布爾索引。例如,查看身高缺失的行:
如果想要同時對幾個列,檢索出全部為缺失或者至少有一個缺失或者沒有缺失的行,可以使用 isna, notna 和any, all 的組合。例如,對身高、體重和轉系情況這 3 列分別進行這三種情況的檢索
1.2 缺失信息的刪除
數據處理中經常需要根據缺失值的大小、比例或其他特徵來進行行樣本或列特徵的刪除,pandas 中提供了dropna 函數來進行操作。
dropna 的主要參數為軸方向 axis (默認為 0,即刪除行)、刪除方式 how 、刪除的非缺失值個數閾值 thresh(非缺失值沒有達到這個數量的相應維度會被刪除)、備選的刪除子集 subset ,其中 how 主要有 any 和 all兩種參數可以選擇。
2 缺失值的填充和插值
2.1 利用 fillna 進行填充
在 fillna 中有三個參數是常用的:value, method, limit 。其中,value 為填充值,可以是標量,也可以是索引到元素的字典映射;method 為填充方法,有用前面的元素填充 ffill 和用後面的元素填充 bfill 兩種類型,limit 參數表示連續缺失值的最大填充次數。
2.2 插值函數
在關於 interpolate 函數的 文檔 描述中,列舉了許多插值法,包括了大量 Scipy 中的方法。由於很多插值方法涉及到比較復雜的數學知識,因此這里只討論比較常用且簡單的三類情況,即線性插值、最近鄰插值和索引插值。
對於 interpolate 而言,除了插值方法(默認為 linear 線性插值)之外,有與 fillna 類似的兩個常用參數,一個是控制方向的 limit_direction ,另一個是控制最大連續缺失值插值個數的 limit 。其中,限制插值的方向默認為 forward ,這與 fillna 的 method 中的 ffill 是類似的,若想要後向限制插值或者雙向限制插值可以指定為 backward 或 both
關於 polynomial 和 spline 插值的注意事項
在 interpolate 中 如 果 選 用 polynomial 的 插 值 方 法, 它 內 部 調 用 的 是scipy.interpolate.interp1d(*,*,kind=order) , 這 個 函 數 內 部 調 用 的 是 make_interp_spline方法,因此其實是樣條插值而不是類似於 numpy 中的 polyfit 多項式擬合插值;而當選用 spline方法時,pandas 調用的是 scipy.interpolate.UnivariateSpline 而不是普通的樣條插值。這一部分的文檔描述比較混亂,而且這種參數的設計也是不合理的,當使用這兩類插值方法時,用戶一定要小心謹慎地根據自己的實際需求選取恰當的插值方法。
3 Nullable 類型
3.1 缺失記號及其缺陷
在 python 中的缺失值用 None 表示,該元素除了等於自己本身之外,與其他任何元素不相等:
在 numpy 中利用 np.nan 來表示缺失值,該元素除了不和其他任何元素相等之外,和自身的比較結果也返回False
值得注意的是,雖然在對缺失序列或表格的元素進行比較操作的時候,np.nan 的對應位置會返回 False ,但是在使用 equals 函數進行兩張表或兩個序列的相同性檢驗時,會自動跳過兩側表都是缺失值的位置,直接返回 True :
在時間序列的對象中,pandas 利用 pd.NaT 來指代缺失值,它的作用和 np.nan 是一致的
那麼為什麼要引入 pd.NaT 來表示時間對象中的缺失呢?仍然以 np.nan 的形式存放會有什麼問題?在 pandas中可以看到 object 類型的對象,而 object 是一種混雜對象類型,如果出現了多個類型的元素同時存儲在 Series中,它的類型就會變成 object
NaT 問題的根源來自於 np.nan 的本身是一種浮點類型,而如果浮點和時間類型混合存儲,如果不設計新的內置缺失類型來處理,就會變成含糊不清的 object 類型,這顯然是不希望看到的。
同時,由於 np.nan 的浮點性質,如果在一個整數的 Series 中出現缺失,那麼其類型會轉變為 float64 ;而如果在一個布爾類型的序列中出現缺失,那麼其類型就會轉為 object 而不是 bool
因此,在進入 1.0.0 版本後,pandas 嘗試設計了一種新的缺失類型 pd.NA 以及三種 Nullable 序列類型來應對這些缺陷,它們分別是 Int, boolean 和 string 。
3.2 Nullable 類型的性質
從字面意義上看 Nullable 就是可空的,言下之意就是序列類型不受缺失值的影響。例如,在上述三個 Nullable類型中存儲缺失值,都會轉為 pandas 內置的 pd.NA
在 Int 的序列中,返回的結果會盡可能地成為 Nullable 的類型
對於 boolean 類型的序列而言,其和 bool 序列的行為主要有兩點區別:
第一點是帶有缺失的布爾列表無法進行索引器中的選擇,而 boolean 會把缺失值看作 False
第二點是在進行邏輯運算時,bool 類型在缺失處返回的永遠是 False ,而 boolean 會根據邏輯運算是否能確定唯一結果來返回相應的值。那什麼叫能否確定唯一結果呢?舉個簡單例子:True | pd.NA 中無論缺失值為什麼值,必然返回 True ;False | pd.NA 中的結果會根據缺失值取值的不同而變化,此時返回 pd.NA ;False& pd.NA 中無論缺失值為什麼值,必然返回 False 。
3.3 缺失數據的計算和分組
當調用函數 sum, prob 使用加法和乘法的時候,缺失數據等價於被分別視作 0 和 1,即不改變原來的計算結果
當使用累計函數時,會自動跳過缺失值所處的位置:
當進行單個標量運算的時候,除了 np.nan ** 0 和 1 ** np.nan 這兩種情況為確定的值之外,所有運算結果全為缺失(pd.NA 的行為與此一致),並且 np.nan 在比較操作時一定返回 False ,而 pd.NA 返回 pd.NA
另外需要注意的是,diff, pct_change 這兩個函數雖然功能相似,但是對於缺失的處理不同,前者凡是參與缺失計算的部分全部設為了缺失值,而後者缺失值位置會被設為 0% 的變化率
對於一些函數而言,缺失可以作為一個類別處理,例如在 groupby, get_mmies 中可以設置相應的參數來進行增加缺失類別:
4 練習
4.1 Ex1:缺失值與類別的相關性檢驗
.4.2 Ex2:用回歸模型解決分類問題
❺ python中利用pandas怎麼處理預設值
null/None/NaN
null經常出現在資料庫中
None是Python中的缺失值,類型是NoneType
NaN也是python中的缺失值,意思是不是一個數字,類型是float
在pandas和Numpy中會將None替換為NaN,而導入資料庫中的時候則需要把NaN替換成None
找出空值
isnull()
notnull()
添加空值
numeric容器會把None轉換為NaN
In [20]: s = pd.Series([1, 2, 3])
In [21]: s.loc[0] = None
In [22]: s
Out[22]:
0 NaN
1 2.0
2 3.0
dtype: float641234567891012345678910
object容器會儲存None
In [23]: s = pd.Series(["a", "b", "c"])
In [24]: s.loc[0] = None
In [25]: s.loc[1] = np.nan
In [26]: s
Out[26]:
0 None
1 NaN
2 c
dtype:
空值計算
arithmetic operations(數學計算)
NaN運算的結果是NaN
statistics and computational methods(統計計算)
NaN會被當成空置
GroupBy
在分組中會忽略空值
清洗空值
填充空值
fillna
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
參數
value : scalar, dict, Series, or DataFrame
method : {『backfill』, 『bfill』, 『pad』, 『ffill』, None}, default None(bfill使用後面的值填充,ffill相反)
axis : {0 or 『index』, 1 or 『columns』}
inplace : boolean, default False
limit : int, default None
downcast : dict, default is None
返回值
filled : DataFrame
Interpolation
replace
刪除空值行或列
DataFrame.dropna(axis=0, how=』any』, thresh=None, subset=None, inplace=False)
參數
axis : {0 or 『index』, 1 or 『columns』}, or tuple/list thereof
how : {『any』, 『all』}
thresh : int, default None
subset : array-like
inplace : boolean, default False
返回
dropped : DataFrame
❻ Python數據處理:篩選、統計、連表、拼接、拆分、缺失值處理
file1_path ='E:/Users/lenovo/Desktop/中視/622召回.csv' # 源數據
格式:file1=pd.read_csv(file1_path)
pd.read_csv(file1_path,encoding='gbk')
pd.read_csv(file1_path,encoding='gbk',skiprows=[2,3])
pd.read_csv(file1_path,encoding='gbk',skiprows=lambda x:x%2==1)
pd.read_csv(file1_path,encoding='gbk',keep_default_na=False)
new=pd.DataFrame()
new.new[[0,1,2]]
new.new[0:2]
查詢結果同上
new.loc[new['激活數']>1000]
loc和iloc的區別:
loc:純標簽篩選
iloc:純數字篩選
#篩選出new的某兩列
new=new.loc[:,['phone','收件人姓名']]
#篩選new的第0,1列
new.iloc[:,[0,1]]
使用『==』篩選-篩查「崔旭」的人(只能篩查指定明確的)
#new=file1.loc[(file1['收件人姓名']=='崔旭')|(file1['收件人姓名']=='崔霞')]
#print(new)
#使用loc函數篩選-str.contains函數-篩查名字中包含'亮'和'海'的人
#new=file1.loc[file1['收件人姓名'].str.contains('亮|海')]
#print(new)
#使用loc函數篩選-str.contains函數-篩查'崔'姓的人
#new=file1.loc[file1['收件人姓名'].str.startswitch('崔')]
#print(new)
df = df[(df['DEPOSIT_PAY_TIME_x'] .notnull() ) & (df['DEPOSIT_PAY_TIME_x'] != "" )]
print("ring_time(number)=0的個數:",newdata[newdata['ring_time(number)'] ==0].count()['ring_time(number)'])
print("ring_time(number)=1,2,3的個數:",newdata[(newdata['ring_time(number)'] >0) & (newdata['ring_time(number)'] <4)].count()['ring_time(number)'])
print(newdata[newdata['ring_time(number)'] ==0])
newdata[newdata['Team']. isin (['England','Italy','Russia'])][['Team','Shooting Accuracy']]
df.年齡.value_counts()
1.修改指定位置數據的值(修改第0行,』創建訂單數『列的值為3836)
new.loc[0,'創建訂單數']=3836
2.替換『小明』-『xiaoming』
df.replace({'name':{'小明':'xiaoming'}})
3.批量替換某一列的值(把『性別』列里的男-male,女-felmale)
方法一:df['性別']=df['性別'].map({'男':'male','女':'female'})
方法二:df['性別'].replace('female','女',inplace=True)
或df['性別']=df['性別'].replace('female','女') 這就是inplace的作用
+df['性別'].replace('male','男',inplace=True)
4.替換列索引
df.columns=['sex','name','height','age']
或者:df.rename(columns={'性別':'sex','姓名':'name','身高':'height','年齡':'age'})
5.刪除某一列
del df['player']
6. 刪除某一列(方法二),刪除某一行(默認axis=0刪除行,為1則刪除列)
刪除某一列(方法二)
df.drop('性別',axis=1)
刪除某一行
df.drop(1,axis=0)
file1=pd.read_csv(file1_path)
file2=pd.read_csv(file2_path)
new1=pd.DataFrame()
new1['phone']=file1['phone']
new1['contact_time']=file1['contact_time']
new2=pd.DataFrame()
new2['phone']=file2['phone']
new2['submission_audit_time']=file2['提交審核時間']
newdata=pd.merge(new1,new2,on='phone',how='left')
df=pd.concat([df1,df2],axis=0)
4.2.2 橫向表連接
df=pd.concat([df1,df2],axis=1)
df1['地區'].str.split('·',3,expand=True)
df1:
df1[['城市', '城區','地址']] = df1['地區'].str.split('·', 3, expand = True)
5.1 缺失值刪除
data.dropna(axis=0,subset = ["Age", "Sex"]) # 丟棄『Age』和『Sex』這兩列中有缺失值的行
data.dropna(how = 'all') # 傳入這個參數後將只丟棄全為缺失值的那些行
data.dropna(axis = 1) # 丟棄有缺失值的列(一般不會這么做,這樣會刪掉一個特徵)
data.dropna(axis=1,how="all") # 丟棄全為缺失值的那些列
5.2 缺失值填充:pandas.DataFrame.fillna()函數
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
功能:使用指定方法填充NA/NaN值
其中inplace=True就是直接在原有基礎上填滿
5.3 缺失值查詢:
缺失值數量查詢:df.isnull().sum()
缺失值行查詢:df[df.isnull().T.any()]
newdata['ring_time']=pd.to_datetime(newdata['submission_audit_time'])-pd.to_datetime(newdata['contact_time'])
newdata['ring_time(number)']=(pd.to_datetime(newdata['submission_audit_time'])-pd.to_datetime(newdata['contact_time'])).apply(lambda x: x.days)
new=pd.DataFrame()
new=newdata[newdata['ring_time(number)'] ==0]
new.to_csv(save_path,encoding='utf-8-sig')
將數據按行拆分並存儲到不同的csv文件中:
path='C:/Users/EDZ/Desktop/工作/2021.08.19/'
for i in range(0,30):
df.loc[[i]].to_csv(path+str(i)+'.csv',encoding='gbk')
df = df[['購葯日期', '星期','社保卡號','商品編碼', '商品名稱', '銷售數量', '應收金額', '實收金額' ]]
❼ python dataframe 如何去除缺失值
1、導入需要的庫。import pandas as pd,import numpy as np,from sklearn.preprocessing import Imputer。
(7)python缺失值處理完整代碼擴展閱讀
Python在執行時,首先會將py文件中的源代碼編譯成Python的byte code(位元組碼),然後再由Python Virtual Machine(Python虛擬機)來執行這些編譯好的byte code。這種機制的基本思想跟Java,NET是一致的。
然而,Python Virtual Machine與Java或.NET的Virtual Machine不同的是,Python的Virtual Machine是一種更高級的Virtual Machine。
這里的高級並不是通常意義上的高級,不是說Python的Virtual Machine比Java或.NET的功能更強大;
說和Java 或NET相比,Python的Virtual Machine距離真實機器的距離更遠。或者可以這么說,Python的Virtual Machine是一種抽象層次更高的Virtual Machine。
基於C的Python編譯出的位元組碼文件,通常是pyc格式。除此之外,Python還可以以交互模式運行,比如主流操作系統Unix/Linux、Mac、Windows都可以直接在命令模式下直接運行Python交互環境。直接下達操作指令即可實現交互操作。
Python的設計目標之一是讓代碼具備高度的可閱讀性。它設計時盡量使用其它語言經常使用的標點符號和英文單字,讓代碼看起來整潔美觀。
它不像其他的靜態語言如C、Pascal那樣需要重復書寫聲明語句,也不像它們的語法那樣經常有特殊情況和意外。
Python開發者有意讓違反了縮進規則的程序不能通過編譯,以此來強制程序員養成良好的編程習慣。
並且Python語言利用縮進表示語句塊的開始和退出(Off-side規則),而非使用花括弧或者某種關鍵字。增加縮進表示語句塊的開始,而減少縮進則表示語句塊的退出。縮進成為了語法的一部分。