1.pandas優(yōu)勢
便捷的數(shù)據(jù)處理能力
讀取文件方便
封裝了Matplotlib涂臣、Numpy的畫圖和計(jì)算
2.pandas主要的兩種數(shù)據(jù)結(jié)構(gòu)
1.Series
表示一維數(shù)據(jù)桨嫁,會自動為這一維數(shù)據(jù)創(chuàng)建行索引星虹。
創(chuàng)建series:index默認(rèn)值為整數(shù)序列,也可自定義壶唤。
se = pd.Series([0.25,0.5,0.75,1.0])
se
0? ?0.25
1? ? 0.50
2? ? 0.75
3? ? 1.00
dtype: float64
Series本身的屬性有兩種,index军援,values
se.index
RangeIndex(start=0, stop=4, step=1)
se.values
array([0.25, 0.5 , 0.75, 1. ])
排序:
使用series.sort_values(ascending=True)對內(nèi)容進(jìn)行排序
series排序時,只有一列鸠补,不需要參數(shù)
se.sort_values()
使用series.sort_index()對索引進(jìn)行排序
se.sort_index()
2.Dataframe
既有行索引,又有列索引,類似于二維數(shù)組
行索引嘀掸,表明不同行莫鸭,橫向索引,叫index
列索引横殴,表名不同列被因,縱向索引,叫columns
創(chuàng)建Dataframe
pd.DataFrame(data)
pd.DataFrame.from_dict(data)
在已有的DataFrame中衫仑,增加N列
df.insert() 下標(biāo)梨与,字段名,添加數(shù)據(jù)
allow_duplicates=True:允許添加重復(fù)的列
df.insert(2,"C",[333,44,55])??
常用屬性:
df.shape? 得到dataframe是幾行幾列的元組
(3, 2)
df.index? ?DataFrame的行索引列表
RangeIndex(start=0, stop=3, step=1)
df.columns?DataFrame的列索引列表
Index(['a', 'b'], dtype='object')
df.values? 直接獲取其中array的值,通過type函數(shù)文狱,可得到
numpy.ndarray
df.values
array([[0, 0],
? ? ? [1, 2],
? ? ? [2, 4]], dtype=int64)
轉(zhuǎn)置 T
df.T
? ? 0 1 2
a? 0 1 2
b? 0 2 4
常用方法:
df.head()??如果不補(bǔ)充參數(shù)粥鞋,默認(rèn)前5行。填入?yún)?shù)N則顯示前N行
df.tail()? ? ? ?如果不補(bǔ)充參數(shù)瞄崇,默認(rèn)后5行呻粹。填入?yún)?shù)N則顯示后N行
DataFrame索引的設(shè)置
修改行列索引值,必須整體全部修改
li = ["A","B"]
df.columns=li
重設(shè)索引值
設(shè)置新的下標(biāo)索引
reset_index(drop=False)
drop:默認(rèn)為False苏研,不刪除原來索引等浊,如果為True,刪除原來的索引值
?index A B
0? 0? 0? 0
1? 1? 1? ?2
2? 2? 2? 4
以某列值設(shè)置為新的索引
set_index(keys,?drop=True)
keys?: 列索引名稱或者列索引名稱的列表
drop?: boolean, default True.當(dāng)做新的索引,刪除原來的列
索引操作
直接使用行列索引(先列后行) 列是列名摹蘑,如果是數(shù)字筹燕,按照行索引取值。
df['A'][2]
結(jié)合loc或者iloc使用索引
使用loc:只能指定行列索引的名字 先行后列
df.loc[0,'A':'B']
A? ? ?0
B? ? 0
Name: 0, dtype: int64
使用iloc可以通過索引的下標(biāo)去獲取? 先行后列
df.columns.get_indexer(["A","B"]) 獲取列中指定字段的下標(biāo)
df.index.get_indexer([1])? ?獲取行中指定字段的下標(biāo)
df.index[下標(biāo)] 根據(jù)下標(biāo)得行中指定字段
df.columns[下標(biāo)]???根據(jù)下標(biāo)得列中指定字段
df.iloc[1,0:2]
A? ? 1
B? ? 2
Name: 1, dtype: int64
使用ix組合索引
ix下標(biāo)和名稱組合索引
df.ix[1:3,"B"]
賦值操作
df.A = 1
df["A"] = 1
排序
對內(nèi)容排序
使用df.sort_values(key=, ascending=)對內(nèi)容進(jìn)行排序
單個鍵或者多個鍵(放入列表中)進(jìn)行排序,默認(rèn)升序
ascending=False:降序
ascending=True:升序
df.sort_values(by="B",ascending=False)
對索引排序
使用df.sort_index對索引進(jìn)行排序
DataFrame運(yùn)算
算術(shù)運(yùn)算
add()? 進(jìn)行數(shù)學(xué)運(yùn)算加上具體的一個數(shù)字
df.A.add(1)
sub()? ?進(jìn)行數(shù)學(xué)運(yùn)算減上具體的一個數(shù)字
df.A.sub(1)
邏輯運(yùn)算
邏輯運(yùn)算符:?<衅鹿、 >撒踪、|、 &
df[(df.A>0)&(df.B<3)]
邏輯運(yùn)算函數(shù):
query(expr)
expr:查詢字符串
df.query('A>0 & B<3')
isin(values1) 指定值是否在values1列表中
df.A.isin([1,2,3])
df.isin([1])
統(tǒng)計(jì)運(yùn)算
?describe() 得到總計(jì)數(shù)大渤,平均值制妄,標(biāo)準(zhǔn)差,最小值泵三,25%分位數(shù)值
50%分位數(shù)值(中位數(shù))耕捞,75%分位數(shù)值,最大值
df.describe()
統(tǒng)計(jì)函數(shù)
min(), max()?, mean(), median(), var(), std()
idxmax()切黔、idxmin() 求出最大值/最小值的位置
0 代表列求結(jié)果砸脊, 1 代表行求統(tǒng)計(jì)結(jié)果
df
? ? A B
0? 1? ?0
1? ?1? 2
2? ?1? 4
df.max(1)
0 1
1? ? 2
2? ? 4
dtype: int64
df.idxmax(1)
0? ?A
1? ? B
2? ? B
dtype: object
df.idxmax(0)
A? ? 0
B? ? 2
dtype: int64
累計(jì)統(tǒng)計(jì)函數(shù)
cumsum計(jì)算前1/2/3/…/n個數(shù)的和
df["A"].cumsum()
0? ? 1
1? ? 2
2? ? 3
cummax計(jì)算前1/2/3/…/n個數(shù)的最大值
cummin計(jì)算前1/2/3/…/n個數(shù)的最小值
cumprod計(jì)算前1/2/3/…/n個數(shù)的積
自定義運(yùn)算
apply(func, axis=0)? 按行或列進(jìn)行計(jì)算
func:自定義函數(shù)
axis=0:默認(rèn)是列,跨行,axis=1為行纬霞, 跨列進(jìn)行運(yùn)算
df.apply(lambda x: x.max() - x.min(),axis=0)
A? ? 0
B? ? 4
dtype: int64
applymap(func)不分行列凌埂,所有元素進(jìn)行計(jì)算
df.applymap(lambda x: x+2)
pandas畫圖
DataFrame.plot(x=None,?y=None,?kind='line')??
x : label or position, default None 指x軸的標(biāo)簽或位置參數(shù),
y : label, position or list of label, positions, default None
Allows plotting of one column versus another
kind : str? 選擇需要的圖形诗芜,默認(rèn)折線圖
‘line’ : line plot (default) 折線圖
‘bar’ : vertical bar plot 條形圖
‘barh’ : horizontal bar plot橫向條形圖
‘hist’ : histogram 柱狀圖
‘pie’ : pie plot 餅圖
‘scatter’ : scatter plot 散點(diǎn)圖 ?需要傳入columns方向的索引
df.plot.bar(x='A',y='B')
文件讀取與存儲
csv
讀韧ァ:pandas.read_csv()
filepath_or_buffer:文件路徑
sep:字符串埃疫,分割符,默認(rèn)值為‘孩哑,’
delimiter : str,default None 定界符栓霜,備選分隔符(如果指定該參數(shù),則sep參數(shù)失效)
usecols:指定讀取的列名横蜒,列表形式
names:添加表頭胳蛮,列表形式
encoding:編碼格式,默認(rèn)utf8
data = pd.read_csv("D:\\BaiduNetdiskDownload\\company_sql.csv",sep=",",encoding='gbk')
存儲:pandas.to_csv()
filepath_or_buffer:文件路徑
sep :字符串丛晌,分隔符
colums=[],想存儲的列
index= ,false,存儲不需要行索引
header=false,存儲不需要列索引
mode= a:追加 w:重寫
data.head().to_csv("D:\\BaiduNetdiskDownload\\company.csv",columns=["companyId","companyFullName"],mode="a",index=False)
sql
讀取pandas.read_sql(sql,?con,?index_col=None,?coerce_float=True,?params=None,?parse_dates=None,?columns=None,?chunksize=None)
sql:執(zhí)行的sql語句
con:連接數(shù)據(jù)庫操作仅炊,使用SQLAlchemy可以使用該庫支持的任何數(shù)據(jù)庫
index_col:要設(shè)置為索引的列
coerce_float:嘗試將非字符串,非數(shù)字對象(如decimal.Decimal)的值轉(zhuǎn)換為浮點(diǎn)澎蛛,這對SQL結(jié)果集很有用
columns:從SQL表中選擇的列名列表(僅在讀取表時使用)
import pymysql
con = pymysql.connect(host="127.0.0.1",user="root",password="wuxin",db="test",charset="utf8")
data_sql = pd.read_sql(sql="select * from student",con=con)
存儲:pandas.to_sql()
name: 輸出的表名
con: 與read_sql中相同抚垄,數(shù)據(jù)庫鏈接
if_exits: 三個模式:fail,若表存在谋逻,則不輸出呆馁;replace:若表存在,覆蓋原來表里的數(shù)據(jù)毁兆;append:若表存在浙滤,將數(shù)據(jù)寫到原表的后面。默認(rèn)為fail
index:是否將df的index單獨(dú)寫到一列中
index_label:指定列作為df的index輸出荧恍,此時index為True
dtype: 指定列的輸出到數(shù)據(jù)庫中的數(shù)據(jù)類型瓷叫。字典形式儲存:{column_name: sql_dtype}。常見的數(shù)據(jù)類型有sqlalchemy.types.INTEGER(), sqlalchemy.types.NVARCHAR(),sqlalchemy.Datetime()等,如果不提供dtype,to_sql會自動根據(jù)df列的dtype選擇默認(rèn)的數(shù)據(jù)類型輸出.
sqlalchemy 連接數(shù)據(jù)庫模式:
'數(shù)據(jù)庫類型+數(shù)據(jù)庫驅(qū)動名稱://用戶名:口令@機(jī)器地址:端口號/數(shù)據(jù)庫名?charset=utf8'
from sqlalchemy import create_engine
engine = create_engine(
? ? "mysql+pymysql://root:root@localhost:3306/test?charset=utf8")
data_sql.to_sql(name="student",con=engine,index=False,if_exists="append")
缺失值處理
先判斷是否有缺失值NaN
pd.isnull(df) /pd.notnull(df)/df.isnull()/df.notnull()
存在缺失值nan, 并且是np.nan:
?1.直接刪除 dropna(axis=0/1)
?2.替換缺失值 fillna(value, inplace=True)
? ??value:替換成的值
????inplace:
????True:會修改原數(shù)據(jù)
????False:不替換修改原數(shù)據(jù)送巡,生成新的對象
若是特殊的符號值,如?等盒卸,
1 先替換'?'為np.nan
df.replace(to_replace=, value=)
to_replace:替換前的值
value:替換后的值
2.再進(jìn)行缺失值的處理
數(shù)據(jù)離散化
離散化:把連續(xù)型數(shù)據(jù)切分為若干“段”骗爆,即把無限空間中有限的個體映射到有限的空間中去,以此提高算法的時空效率蔽介。
優(yōu)勢:①算法需要摘投。②離散化可以有效地克服數(shù)據(jù)中隱藏的缺陷:使模型結(jié)果更加穩(wěn)定。③降低時間虹蓄、空間復(fù)雜度
流程:
對數(shù)據(jù)進(jìn)行分組
自動分組:pd.qcut(data, bins)
自定義分組:pd.cut(data, bins)
對數(shù)據(jù)進(jìn)行分組將數(shù)據(jù)分組 一般會與value_counts搭配使用犀呼,統(tǒng)計(jì)每組的個數(shù)
series.value_counts():統(tǒng)計(jì)分組次數(shù)
對分好組的數(shù)據(jù)求啞變量
pandas.get_dummies(data,?prefix=None)
data:array-like, Series, or DataFrame
prefix:分組名字
合并
concat?索引合并
pd.concat([data1,data2],axis=1)
data數(shù)據(jù)類型為Dataframe類型
按照行或列進(jìn)行合并,axis=0為列索引,axis=1為行索引
merge進(jìn)行按照鍵合并
pd.merge(left, right, how='inner', on=[左右共同字段], left_on=None, suffixes=('_x', '_y'))
可以指定按照兩組數(shù)據(jù)的共同鍵值對合并或者左右各自
left: A DataFrame object
right: Another DataFrame object
how:?inner薇组,outer外臂,left,right
left_on=None, right_on=None:指定左右鍵
suffixes:如果和表合并的過程中遇到有一列兩個表都同名律胀,但是值不同宋光,合并的時候又都想保留下來貌矿,就可以用suffixes給每個表的重復(fù)列名增加后綴。
交叉表與透視表:
交叉表:交叉表用于計(jì)算一列數(shù)據(jù)對于另外一列數(shù)據(jù)的分組個數(shù)(尋找兩個列之間的關(guān)系)
pd.crosstab(value1, value2)
透視表:
DataFrame.pivot_table([], index=[])
分組與聚合
分組與聚合通常是分析數(shù)據(jù)的一種方式罪佳,通常與一些統(tǒng)計(jì)函數(shù)一起使用逛漫,查看數(shù)據(jù)的分組情況
分組:
data.groupby(by,)
key:按key分組赘艳,多個key酌毡,用列表
as_index:true,false保存行索引
聚合:就是將分組后的數(shù)據(jù)蕾管,count/sum等枷踏。