pandas常用操作

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等枷踏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市娇掏,隨后出現(xiàn)的幾起案子呕寝,更是在濱河造成了極大的恐慌,老刑警劉巖婴梧,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件下梢,死亡現(xiàn)場離奇詭異,居然都是意外死亡塞蹭,警方通過查閱死者的電腦和手機(jī)孽江,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來番电,“玉大人岗屏,你說我怎么就攤上這事∈欤” “怎么了这刷?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長娩井。 經(jīng)常有香客問我暇屋,道長,這世上最難降的妖魔是什么洞辣? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任咐刨,我火速辦了婚禮,結(jié)果婚禮上扬霜,老公的妹妹穿的比我還像新娘定鸟。我一直安慰自己,他們只是感情好著瓶,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布联予。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪躯泰。 梳的紋絲不亂的頭發(fā)上谭羔,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音麦向,去河邊找鬼瘟裸。 笑死,一個胖子當(dāng)著我的面吹牛诵竭,可吹牛的內(nèi)容都是我干的话告。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼卵慰,長吁一口氣:“原來是場噩夢啊……” “哼沙郭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起裳朋,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤病线,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鲤嫡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體送挑,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年暖眼,在試婚紗的時候發(fā)現(xiàn)自己被綠了惕耕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡诫肠,死狀恐怖司澎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情栋豫,我是刑警寧澤挤安,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站丧鸯,受9級特大地震影響漱受,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骡送,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望絮记。 院中可真熱鬧摔踱,春花似錦、人聲如沸怨愤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至篮愉,卻和暖如春腐芍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背试躏。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工猪勇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颠蕴。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓泣刹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親犀被。 傳聞我的和親對象是個殘疾皇子椅您,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容