分享20個(gè)Pandas短小精悍的數(shù)據(jù)操作
1. ExcelWriter
很多時(shí)候dataframe
里面有中文,如果直接輸出到csv里,中文將顯示亂碼。而Excel就不一樣了,ExcelWriter
是pandas
的一個(gè)類,可以使dataframe
數(shù)據(jù)框直接輸出到excel文件,并可以指定sheets
名稱。
df1?=?pd.DataFrame([["AAA",?"BBB"]],?columns=["Spam",?"Egg"]) df2?=?pd.DataFrame([["ABC",?"XYZ"]],?columns=["Foo",?"Bar"]) with?ExcelWriter("path_to_file.xlsx")?as?writer: ????df1.to_excel(writer,?sheet_name="Sheet1") ????df2.to_excel(writer,?sheet_name="Sheet2")
如果有時(shí)間變量,輸出時(shí)還可以date_format
指定時(shí)間的格式。另外,它還可以通過mode
設(shè)置輸出到已有的excel文件中,非常靈活。
with?ExcelWriter("path_to_file.xlsx",?mode="a",?engine="openpyxl")?as?writer: ????df.to_excel(writer,?sheet_name="Sheet3")
2. pipe
pipe
管道函數(shù)可以將多個(gè)自定義函數(shù)裝進(jìn)同一個(gè)操作里,讓整個(gè)代碼更簡(jiǎn)潔,更緊湊。
比如,我們?cè)谧鰯?shù)據(jù)清洗的時(shí)候,往往代碼會(huì)很亂,有去重、去異常值、編碼轉(zhuǎn)換等等。如果使用pipe
,將是這樣子的。
diamonds?=?sns.load_dataset("diamonds") df_preped?=?(diamonds.pipe(drop_duplicates). ??????????????????????pipe(remove_outliers,?['price',?'carat',?'depth']). ??????????????????????pipe(encode_categoricals,?['cut',?'color',?'clarity']) ????????????)
兩個(gè)字,干凈!
3. factorize
factorize
這個(gè)函數(shù)類似sklearn
中LabelEncoder
,可以實(shí)現(xiàn)同樣的功能。
#?Mind?the?[0]?at?the?end diamonds["cut_enc"]?=?pd.factorize(diamonds["cut"])[0] >>>?diamonds["cut_enc"].sample(5) 52103????2 39813????0 31843????0 10675????0 6634?????0 Name:?cut_enc,?dtype:?int64
區(qū)別是,factorize
返回一個(gè)二值元組:編碼的列和唯一分類值的列表。
codes,?unique?=?pd.factorize(diamonds["cut"],?sort=True) >>>?codes[:10] array([0,?1,?3,?1,?3,?2,?2,?2,?4,?2],?dtype=int64) >>>?unique ['Ideal',?'Premium',?'Very?Good',?'Good',?'Fair']
4. explode
explode
爆炸功能,可以將array-like的值比如列表,炸開轉(zhuǎn)換成多行。
data?=?pd.Series([1,?6,?7,?[46,?56,?49],?45,?[15,?10,?12]]).to_frame("dirty") data.explode("dirty",?ignore_index=True)
5. squeeze
很多時(shí)候,我們用.loc
篩選想返回一個(gè)值,但返回的卻是個(gè)series
。其實(shí),只要使用.squeeze()
即可完美解決。比如:
#?沒使用squeeze subset?=?diamonds.loc[diamonds.index?<?1,?["price"]] #?使用squeeze subset.squeeze("columns")
可以看到,壓縮完結(jié)果已經(jīng)是int64
的格式了,而不再是series
。
6. between
dataframe
的篩選方法有很多,常見的loc
、isin
等等,但其實(shí)還有個(gè)及其簡(jiǎn)潔的方法,專門篩選數(shù)值范圍的,就是between
,用法很簡(jiǎn)單。
diamonds[diamonds["price"]\ ??????.between(3500,?3700,?inclusive="neither")].sample(5)
7. T
這是所有的dataframe
都有的一個(gè)簡(jiǎn)單屬性,實(shí)現(xiàn)轉(zhuǎn)置功能。它在顯示describe
時(shí)可以很好的搭配。
boston.describe().T.head(10)
8. pandas styler
pandas
也可以像excel一樣,設(shè)置表格的可視化條件格式,而且只需要一行代碼即可(可能需要一丟丟的前端HTML和CSS基礎(chǔ)知識(shí))。
>>>?diabetes.describe().T.drop("count",?axis=1)\ ?????????????????.style.highlight_max(color="darkred")
當(dāng)然了,條件格式有非常多種。
9. Pandas options
pandas
里提供了很多宏設(shè)置選項(xiàng),被分為下面5大類。
dir(pd.options) ['compute',?'display',?'io',?'mode',?'plotting']
一般情況下使用display
會(huì)多一點(diǎn),比如最大、最小顯示行數(shù),畫圖方法,顯示精度等等。
pd.options.display.max_columns?=?None pd.options.display.precision?=?5
10. convert_dtypes
經(jīng)常使用pandas
的都知道,pandas
對(duì)于經(jīng)常會(huì)將變量類型直接變成object
,導(dǎo)致后續(xù)無法正常操作。這種情況可以用convert_dtypes
進(jìn)行批量的轉(zhuǎn)換,它會(huì)自動(dòng)推斷數(shù)據(jù)原來的類型,并實(shí)現(xiàn)轉(zhuǎn)換。
sample?=?pd.read_csv( ????"data/station_day.csv", ????usecols=["StationId",?"CO",?"O3",?"AQI_Bucket"], ) >>>?sample.dtypes StationId??????object CO????????????float64 O3????????????float64 AQI_Bucket?????object dtype:?object >>>?sample.convert_dtypes().dtypes StationId??????string CO????????????float64 O3????????????float64 AQI_Bucket?????string dtype:?object
11. select_dtypes
在需要篩選變量類型的時(shí)候,可以直接用selec _dtypes
,通過include
和exclude
篩選和排除變量的類型。
#?選擇數(shù)值型的變量 diamonds.select_dtypes(include=np.number).head() #?排除數(shù)值型的變量 diamonds.select_dtypes(exclude=np.number).head()
12. mask
mask
可以在自定義條件下快速替換單元值,在很多三方庫的源碼中經(jīng)常見到。比如下面我們想讓age為50-60以外的單元為空,只需要在con
和ohter
寫好自定義的條件即可。
ages?=?pd.Series([55,?52,?50,?66,?57,?59,?49,?60]).to_frame("ages") ages.mask(cond=~ages["ages"].between(50,?60),?other=np.nan)
13. 列軸的min、max
雖然大家都知道min
和max
的功能,但應(yīng)用在列上的應(yīng)該不多見。這對(duì)函數(shù)其實(shí)還可以這么用:
index?=?["Diamonds",?"Titanic",?"Iris",?"Heart?Disease",?"Loan?Default"] libraries?=?["XGBoost",?"CatBoost",?"LightGBM",?"Sklearn?GB"] df?=?pd.DataFrame( ????{lib:?np.random.uniform(90,?100,?5)?for?lib?in?libraries},?index=index ) >>>?df
>>>?df.max(axis=1) Diamonds?????????99.52684 Titanic??????????99.63650 Iris?????????????99.10989 Heart?Disease????99.31627 Loan?Default?????97.96728 dtype:?float64
14. nlargest、nsmallest
有時(shí)我們不僅想要列的最小值/最大值,還想看變量的前 N 個(gè)或 ~(top N)
個(gè)值。這時(shí)nlargest
和nsmallest
就派上用場(chǎng)了。
diamonds.nlargest(5,?"price")
15. idmax、idxmin
我們用列軸使用max
或min
時(shí),pandas
會(huì)返回最大/最小的值。但我現(xiàn)在不需要具體的值了,我需要這個(gè)最大值的位置。因?yàn)楹芏鄷r(shí)候要鎖定位置之后對(duì)整個(gè)行進(jìn)行操作,比如單提出來或者刪除等,所以這種需求還是很常見的。
使用idxmax
和idxmin
即可解決。
>>>?diamonds.price.idxmax() 27749 >>>?diamonds.carat.idxmin() 14
16. value_counts
在數(shù)據(jù)探索的時(shí)候,value_counts
是使用很頻繁的函數(shù),它默認(rèn)是不統(tǒng)計(jì)空值的,但空值往往也是我們很關(guān)心的。如果想統(tǒng)計(jì)空值,可以將參數(shù)dropna
設(shè)置為False
。
ames_housing?=?pd.read_csv("data/train.csv") >>>?ames_housing["FireplaceQu"].value_counts(dropna=False,?normalize=True) NaN????0.47260 Gd?????0.26027 TA?????0.21438 Fa?????0.02260 Ex?????0.01644 Po?????0.01370 Name:?FireplaceQu,?dtype:?float64
17. clip
異常值檢測(cè)是數(shù)據(jù)分析中常見的操作。使用clip
函數(shù)可以很容易地找到變量范圍之外的異常值,并替換它們。
>>>?age.clip(50,?60)
18. at_time、between_time
在有時(shí)間粒度比較細(xì)的時(shí)候,這兩個(gè)函數(shù)超級(jí)有用。因?yàn)樗鼈兛梢赃M(jìn)行更細(xì)化的操作,比如篩選某個(gè)時(shí)點(diǎn),或者某個(gè)范圍時(shí)間等,可以細(xì)化到小時(shí)分鐘。
>>>?data.at_time("15:00")
from?datetime?import?datetime >>>?data.between_time("09:45",?"12:00")
19. hasnans
pandas
提供了一種快速方法hasnans
來檢查給定series是否包含空值。
series?=?pd.Series([2,?4,?6,?"sadf",?np.nan]) >>>?series.hasnans True
該方法只適用于series
的結(jié)構(gòu)。
20. GroupBy.nth
此功能僅適用于GroupBy
對(duì)象。具體來說,分組后,nth
返回每組的第n行:
>>>?diamonds.groupby("cut").nth(5)
到此這篇關(guān)于分享20個(gè)Pandas短小精悍的數(shù)據(jù)操作的文章就介紹到這了,更多相關(guān)Pandas數(shù)據(jù)操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 用Python的pandas框架操作Excel文件中的數(shù)據(jù)教程
- Python數(shù)據(jù)分析庫pandas基本操作方法
- pandas數(shù)據(jù)篩選和csv操作的實(shí)現(xiàn)方法
- Python Pandas數(shù)據(jù)中對(duì)時(shí)間的操作
- Python數(shù)據(jù)分析之pandas比較操作
- 五個(gè)Pandas?實(shí)戰(zhàn)案例帶你分析操作數(shù)據(jù)
- Python Pandas學(xué)習(xí)之基本數(shù)據(jù)操作詳解
- Pandas實(shí)現(xiàn)數(shù)據(jù)拼接的操作方法詳解
相關(guān)文章
5個(gè)Python使用F-String進(jìn)行格式化的實(shí)用技巧分享
F-String(格式化字符串字面值)是在Python?3.6中引入的,它是一種非常強(qiáng)大且靈活的字符串格式化方法,本文總結(jié)了5個(gè)實(shí)用的F-String技巧,相信一定能讓你的代碼輸出更加的美觀,快跟隨小編一起學(xué)習(xí)起來吧2024-03-03Python如何存儲(chǔ)數(shù)據(jù)到j(luò)son文件
這篇文章主要介紹了Python如何存儲(chǔ)數(shù)據(jù)到j(luò)son文件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03python 求1-100之間的奇數(shù)或者偶數(shù)之和的實(shí)例
今天小編就為大家分享一篇python 求1-100之間的奇數(shù)或者偶數(shù)之和的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06Python數(shù)據(jù)類型之Dict字典實(shí)例詳解
這篇文章主要介紹了Python數(shù)據(jù)類型之Dict字典,結(jié)合具體實(shí)例形式詳細(xì)分析了Python字典的概念、原理、定義、元素添加、刪除、遍歷等相關(guān)操作技巧,需要的朋友可以參考下2019-05-05python 已知一個(gè)字符,在一個(gè)list中找出近似值或相似值實(shí)現(xiàn)模糊匹配
今天小編就為大家分享一篇python 已知一個(gè)字符,在一個(gè)list中找出近似值或相似值實(shí)現(xiàn)模糊匹配,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02python新式類和經(jīng)典類的區(qū)別實(shí)例分析
這篇文章主要介紹了python新式類和經(jīng)典類的區(qū)別,結(jié)合實(shí)例形式分析了python新式類和經(jīng)典類的功能、區(qū)別與使用方法,需要的朋友可以參考下2020-03-03Python開發(fā)游戲之井字游戲的實(shí)戰(zhàn)步驟
最近正在學(xué)習(xí)Python,所以最近做了一個(gè)關(guān)于Python的實(shí)例,下面這篇文章主要給大家介紹了關(guān)于Python開發(fā)游戲之井字游戲的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02