20 個短小精悍的pandas 騷操作
大家好,我是東哥啊。
本次為大家準備了一個系列內容,請看
1. ExcelWriter
很多時候而Excel就不一樣了,
df1=pd.DataFrame([["AAA","BBB"]],columns=["Spam","Egg"])df2=pd.DataFrame([["ABC","XYZ"]],columns=["Foo","Bar"])withExcelWriter("path_to_file.xlsx")aswriter:df1.to_excel(writer,sheet_name="Sheet1")df2.to_excel(writer,sheet_name="Sheet2")
如果有時間變量,輸出時還可以另外,它還可以通過
withExcelWriter("path_to_file.xlsx",mode="a",engine="openpyxl")aswriter:df.to_excel(writer,sheet_name="Sheet3")
2. pipe
pipe
比如,我們在做數據清洗的時候,往往代碼會很亂,有去重、去異常值、編碼轉換等等。如果使用
diamonds=sns.load_dataset("diamonds")df_preped=(diamonds.pipe(drop_duplicates).pipe(remove_outliers,['price','carat','depth']).pipe(encode_categoricals,['cut','color','clarity']))
兩個字,
3. factorize
factorize
# Mind the [0] at the enddiamonds["cut_enc"]=pd.factorize(diamonds["cut"])[0]>>>diamonds["cut_enc"].sample(5)52103239813031843010675066340Name:cut_enc,dtype:int64
區別是,
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
data=pd.Series([1,6,7,[46,56,49],45,[15,10,12]]).to_frame("dirty")data.explode("dirty",ignore_index=True)

這部分可以參考我之前寫的騷操作系列:
5. squeeze
很多時候,我們用其實,只要使用比如:
# 没使用squeezesubset=diamonds.loc[diamonds.index<1,["price"]]# 使用squeezesubset.squeeze("columns")

可以看到,壓縮完結果已經是這部分可以參考我之前寫的騷操作系列:
6. between
dataframe
diamonds diamonds [ diamonds [ "price" ] . between ( 3500 , 3700 , inclusive = "neither" )] . sample ( 5 )

7. T
這是所有的它在顯示
boston.describe().T.head(10)

8. pandas styler
pandas
>>> >>> diabetes . describe () . T . drop ( "count" , axis = 1 ) . style . highlight_max ( color = "darkred" )

當然了,條件格式有非常多種。詳細的可以參考我之前寫的騷操作系列:
9. Pandas options
pandas
dir(pd.options)['compute','display','io','mode','plotting']
一般情況下使用
pd.options.display.max_columns=Nonepd.options.display.precision=5
這部分東哥之前進行過總結,可以參考我之前寫的騷操作系列:
10. convert_dtypes
經常使用這種情況可以用
sample=pd.read_csv("data/station_day.csv",usecols=["StationId","CO","O3","AQI_Bucket"],)>>>sample.dtypesStationIdobjectCOfloat64O3float64AQI_Bucketobjectdtype:object>>>sample.convert_dtypes().dtypesStationIdstringCOfloat64O3float64AQI_Bucketstringdtype:object
可以參考我之前寫的騷操作系列:
11. select_dtypes
在需要篩選變量類型的時候,可以直接用
# 选择数值型的变量diamonds.select_dtypes(include=np.number).head()# 排除数值型的变量diamonds.select_dtypes(exclude=np.number).head()
12. mask
mask比如下面我們想讓age為50-60以外的單元為空,只需要在
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
雖然大家都知道這對函數其實還可以這麼用:
index=["Diamonds","Titanic","Iris","Heart Disease","Loan Default"]libraries=["XGBoost","CatBoost","LightGBM","Sklearn GB"]df=pd.DataFrame({lib:np.random.uniform(90,100,5)forlibinlibraries},index=index)>>>df

>>>df.max(axis=1)Diamonds99.52684Titanic99.63650Iris99.10989HeartDisease99.31627LoanDefault97.96728dtype:float64
14. nlargest、nsmallest
有時我們不僅想要列的最小值/最大值,還想看變量的前N 個或這時
diamonds.nlargest(5,"price")

15. idmax、idxmin
我們用列軸使用但我現在不需要具體的值了,我需要這個最大值的位置。因為很多時候要鎖定位置之後對整個行進行操作,比如單提出來或者刪除等,所以這種需求還是很常見的。
使用
>>>diamonds.price.idxmax()27749>>>diamonds.carat.idxmin()14
16. value_counts
在數據探索的時候,如果想統計空值,可以將參數
ames_housing=pd.read_csv("data/train.csv")>>>ames_housing["FireplaceQu"].value_counts(dropna=False,normalize=True)NaN0.47260Gd0.26027TA0.21438Fa0.02260Ex0.01644Po0.01370Name:FireplaceQu,dtype:float64
17. clip
異常值檢測是數據分析中常見的操作。使用
>>>age.clip(50,60)

18. at_time、between_time
在有時間粒度比較細的時候,這兩個函數超級有用。因為它們可以進行更細化的操作,比如篩選某個時點,或者某個範圍時間等,可以細化到小時分鐘。
>>>data.at_time("15:00")

fromdatetimeimportdatetime>>>data.between_time("09:45","12:00")

19. hasnans
pandas
series=pd.Series([2,4,6,"sadf",np.nan])>>>series.hasnansTrue
該方法只適用於
20. GroupBy.nth
此功能僅適用於具體來說,分組後,
>>>diamonds.groupby("cut").nth(5)

參考: [1]
[2]
原創不易,歡迎點贊、在看和分享。
原創文章持續更新,可以微信搜一搜「