python pandas資料分組相關

2021-09-24 04:12:22 字數 3501 閱讀 4587

資料的分組

先初始化資料

import pandas as pd

import numpy as np

data =

df = pd.dataframe(data)

groupby

分組使用groupby函式,與mysql的相同

分組之後從乙個df變成group物件,裡面是多個df

group物件再呼叫聚合函式,就是每個df用聚合函式得到乙個結果,多個結果連成新df

df.groupby(

["year"])

#df.groupby(

["year"])

.max()

# 這裡會導致分組使用的key變成idx,保持之前的**加引數 as_index=false

# num name

#year

#2016 5 b

#2017 8 e

#2018 90 g

#2019 5 h

df.groupby(

["year"

],as_index=

false).

max(

)# 這裡取到的是2018組裡num最大(90)和name最大(g),兩者並不在一行

# year num name

#0 2016 5 b

#1 2017 8 e

#2 2018 90 g

#3 2019 5 h

agg

另一種是aggregate函式或者agg函式,對資料進行聚類操作

這個可以同時指定多種聚合函式

df.agg(

["min"

,"max"])

# year num name

#min 2016 2 a

#max 2019 90 h

# 還有一種使用字典指定名字的 我這個python3不支援了就不列出來了,只放個以前的例子

#df_c = df.groupby(["dept", "dest", "date", "class"])["book"].agg()

merge

分組聚合就是上面的函式了,都是產生了另乙個df,最後再合併到原本的df就是使用merge函式

與mysql的join一樣理解,有left、right、inner等模式。

df_c = df.groupby(by=

["year"])

["num"

].agg(

["min"

,"max"])

# min max

#year

#2016 2 5

#2017 4 8

#2018 78 90

#2019 5 5

df_c.columns =

["num_min"

,"num_max"

]# 修改列名

df = pd.merge(df, df_c, how=

"left"

, on=

["year"])

# 使用left join

df = pd.merge(df, df_c, how=

"left"

, left_on=

"year"

, right_on=

"year"

)# 也可以兩邊指定不同的列

# year num name num_min num_max

#0 2016 2 a 2 5

#1 2016 5 b 2 5

#2 2017 4 c 4 8

#3 2017 7 d 4 8

#4 2017 8 e 4 8

#5 2018 90 f 78 90

#6 2018 78 g 78 90

#7 2019 5 h 5 5

兩個要注意的點,

1.merge的時候,最好保證兩邊的key在各自df裡都不會重複,這樣合併時候為一對一直接相連。如果有重複的話,會以笛卡爾積的方式增加行。

2.例如 left merge, 當有key左邊有右邊沒有時,會以nan填充,左邊沒有右邊有時候不會出現這一行。最後可以加dropna() 或者 fillna(0)來處理這種資料。

其他實用技巧

# 修改df的列順序

cols =

["year"

,"num"

,"num_min"

,"num_max"

,"name"

]# 設定新的順序,只是修改了展示的順序

df.loc[

:, cols]

# 直接在df上修改

df.insert(7,

"book"

, df.pop(

"book"))

# 分組將同一組的字串相連

# 思路一 1.字串變成陣列 2.求該列sum 3.陣列變字串

# 還是粘個別的例子吧

#no = df.groupby(by=["dept", "dest", "date", "class", "depttime", "desttime"], as_index=false)["no"].sum()

# df.groupby(

"year").

(lambda x :

"_".join(

[ a for a in x[

"name"]]

))# 取最大值所在的列

mask = df.groupby(

"year"

, as_index=

false)[

"num"

].idxmax(

)# idxmax是取最大值所在的index

df.iloc[mask]

# 然後用iloc根據index取出相應的行

# 檔案操作

df.to_csv(

"test"

, sep=

'\t'

, index=

false

, header=

false

)# 指定分隔符,行列的標籤是否展示

df.read_csv(

"xx"

, sep=

'\t'

, index=

false

, header=

false

)

python Pandas讀取資料

import pandas as pd fpath 檔案路徑 df pd.read csv fpath 使用pd.read csv讀取資料 df.head 檢視前幾行資料 df.shape 檢視資料的形狀返回df的行數和列數 df.columns 檢視df的列名 df.index 檢視索引列 df....

python pandas資料探勘實驗

import pandas as pd isir pd.read table r c users asus desktop iris pandas.csv sep print isir.head sepallength sepalwidth petallength petalwidth specie...

Python pandas匯入 讀取資料

作為進行分析的第一步,我們首先需要讀取資料,今天就來分享下利用pandas讀取excel和csv資料 import pandas as pd data pd.read csv c users cs desktop data.csv csv的讀取非常簡單,只要注意路徑中使用 或者 而不要使用 利用 p...