1、pandas對缺失數據的處理
我們的數據缺失通常有兩種情況: 1、一種就是空,None等,在pandas是NaN(和np.nan一樣)
解決方法:
判斷數據是否為NaN:pd.isnull(df),pd.notnull(df)
處理方式1:刪除NaN所在的行列dropna (axis=0, how='any', inplace=False)
處理方式2:填充數據,t.fillna(t.mean()),t.fiallna(t.median()),t.fillna(0)
2、另一種是我們讓其為0,藍色框中
解決方法:
step1、處理為0的數據:t[t==0]=np.nan 當然並不是每次為0的數據都需要處理 計算平均值等情況,nan是不參與計算的,但是0會
step2、然后在對nan進行操作
注意:fiillna(t.mean())填充只針對該nan的列的平均值進行填充
2、常用的統計方法
df["name"].unique()#獲取不重復的列表數據 df["name"].mean()#取平均值 df["name"].max()#取最大值 df["name"].min()#取最小值 df["name"].argmin()#取最小值位置 df["name"].argman()#取最大值位置 df["name"].median()#取中位數
3、pandas 實現one hot編碼方式
1、重新構造一個全為0的數組,行名為分類,長度為原數據長度 zeros_df = pd.DataFrame(np.zeros((df.shape[0],len(cate_list))),columns=cate_list)
2、如果某一條數據中分類出現過,就讓它由0變為1 方式1: for cate in cate_list: zeros_df[cate][df["title"].str.contains(cate)]=1

方式2: for i in range(df.shape[0]): zeros_df.loc[i][temp_list[i][0]] = 1 方式3: cate_list = [i[0] for i in temp_list] df["cate"] = pd.DataFrame(np.array(cate_list).reshape((df.shape[0],1)))
4、數據合並Join和Merge
Join :默認情況下它是把行索引相同的數據合並在一起 print '使用默認的左連接\r\n',data.join(data1) #這里可以看出自動屏蔽了data中沒有的index=e 那一行的數據 print '使用右連接\r\n',data.join(data1,how="right") #這里出自動屏蔽了data1中沒有index=c,d的那行數據;等價於data1.join(data) print '使用內連接\r\n',data.join(data1,how='inner') print '使用全外連接\r\n',data.join(data1,how='outer') Merge:按照指定的列把數據按照一定方式合並在一起 print "單個列名做為內鏈接的連接鍵\r\n",merge(data,data1,on="name",suffixes=('_a','_b'))
print "多列名做為內鏈接的連接鍵\r\n",merge(data,data2,on=("name","id")) print '不指定on則以兩個DataFrame的列名交集做為連接鍵\r\n',merge(data,data2) #這里使用了id與name #使用右邊的DataFrame的行索引做為連接鍵 ##設置行索引名稱 indexed_data1=data1.set_index("name") print "使用右邊的DataFrame的行索引做為連接鍵\r\n",merge(data,indexed_data1,left_on='name',right_index=True) print '左外連接\r\n',merge(data,data1,on="name",how="left",suffixes=('_a','_b')) print '左外連接1\r\n',merge(data1,data,on="name",how="left") print '右外連接\r\n',merge(data,data1,on="name",how="right") data3=DataFrame([{"mid":0,"mname":'lxh','cs':10},{"mid":101,"mname":'xiao','cs':40},{"mid":102,"mname":'hua2','cs':50}]) #當左右兩個DataFrame的列名不同,當又想做為連接鍵時可以使用left_on與right_on來指定連接鍵 print "使用left_on與right_on來指定列名字不同的連接鍵\r\n",merge(data,data3,left_on=["name","id"],right_on=["mname","mid"])
example :
# coding=utf-8 import numpy as np import pandas as pd def merge(): """ merge使用 :return: """ data1 = pd.DataFrame(np.arange(24).reshape(4,6),columns=list("abcdef")) data2 = pd.DataFrame(np.arange(24).reshape(4,6),columns=list("avwxyz")) data1.iloc[2,0] = 100 print(data1) print(data2) #inner連接 ,選取兩邊都存在的值,即取交集 print(pd.merge(data1,data2,on=["a","a"])) # 右連接,以data2為主表,如果data1表中沒有data2對應的數據,則置為NaN print(pd.merge(data1,data2,on=["a","a"],how="right")) data1 = pd.DataFrame(np.arange(24).reshape(4,6),columns=list("abcdef")) data2 = pd.DataFrame(np.arange(24).reshape(4,6),columns=list("qvwxyz")) data1.iloc[2,0] = 100 print(data1) print(data2) #如果兩個表的列名稱不對應,則使用left_on 與right_on一起使用,兩個必須一起使用,反之,如果列名對應,則使用on print(pd.merge(data1,data2,left_on=["a"],right_on=["q"])) #左表以"a"作為連接主鍵,右表以"q"連接 return None def join(): """ join使用:行合並 如果存在相同的列名,則不能使用,只能使用merge :return: """ data1 = pd.DataFrame(np.arange(24).reshape(4, 6), columns=list("abcdef")) data2 = pd.DataFrame(np.arange(12).reshape(3, 4), columns=list("wxyz")) data1.iloc[3,0]=100 print(data1) print(data2) print(data1.join(data2)) #直接將兩個數據進行行添加 print(data1.join(data2,how="right")) #以右表為主連接表 print(data1.join(data2, how="left")) #以左表為主連接表 return None def concat(): """ concat使用:全連接方式 :return: """ data1 = pd.DataFrame(np.arange(24).reshape(4, 6), columns=list("abcdef")) data2 = pd.DataFrame(np.arange(12).reshape(3, 4), columns=list("wxyz")) data1.iloc[3, 0] = 100 print(data1) print(data2) frame = [data1,data2] print(pd.concat(frame)) #全連接 print(pd.concat(frame,keys=["h","i"])) #指定行索引 return None if __name__ == '__main__': #merge() #join() concat()
5、分組與聚合
grouped = df.groupby(by="columns_name") grouped是一個DataFrameGroupBy對象,是可迭代的 grouped中的每一個元素是一個元組,元組里面是(索引(分組的值),分組之后的DataFrame)
獲取分組之后的某一部分數據:
df.groupby(by=["Country","State/Province"])["Country"].count()
對某幾列數據進行分組:
df["Country"].groupby(by=[df["Country"],df["State/Province"]]).count()
分組方式(t1,t2結果一樣):
t1 = df[["Country"]].groupby(by=[df["Country"],df["State/Province"]]).count()
t2 = df.groupby(by=["Country","State/Province"])[["Country"]].count()
DataFrameGroupBy對象方法:

6、索引與復合索引
a)簡單的索引操作: 獲取index:df.index 指定index :df.index = ['x','y'] 重新設置index : df.reindex(list("abcedf")) 指定某一列作為index :df.set_index("Country",drop=False) 返回index的唯一值:df.set_index("Country").index.unique()
b)Series復合索引

c)DataFrame復合索引