1. 程式人生 > 其它 >速戰速決 Python - python 第三方庫(pandas): DataFrame篩選和分組

速戰速決 Python - python 第三方庫(pandas): DataFrame篩選和分組

速戰速決 Python - python 第三方庫(pandas): DataFrame篩選和分組

速戰速決 Python https://github.com/webabcd/PythonSample
作者 webabcd

速戰速決 Python - python 第三方庫(pandas): DataFrame篩選和分組

示例如下:

thirdLib/pandas/sample4.py

# pandas
#   DataFrame 篩選和分組

import pandas as pd

data = {
    "age": [40, 25, 22, 28, 28],
    "gender": ['M', 'F', 'M', 'M', 'F'],
    "city": ['beijing', 'beijing', 'shanghai', 'beijing', 'shanghai']
}
index = pd.Index(['zhao', 'qian', 'sun', 'li', 'zhou'])
a = pd.DataFrame(data=data, index=index)
print(a)
'''
      age gender      city
zhao   40      M   beijing
qian   25      F   beijing
sun    22      M  shanghai
li     28      M   beijing
zhou   28      F  shanghai
'''


# 按照索引正序排序
print(a.sort_index())
# 按照索引倒序排序
print(a.sort_index(ascending=False))
# 按照指定欄位和指定順序排序
print(a.sort_values(by="age", ascending=False))
# 先按 city 排序,再按 age 排序
print(a.sort_values(by=["city", "age"]))


# 取前 n 條資料
print(a.head(2))
# 取後 n 條資料
print(a.tail(2))
# 獲取 age 欄位最大的前 2 條資料
print(a.nlargest(2, 'age'))
# 獲取 age 欄位最小的前 2 條資料
print(a.nsmallest(2, 'age'))


# 取索引 zhao 和 sun 的資料
print(a.loc[['zhao', 'sun']]) 
# 取索引 zhao 到 sun 之間的資料
print(a.loc['zhao':'sun']) 
# 取 age 列和 city 列的全部資料
print(a.loc[:, ["age", "city"]])
# 取索引 zhao 和 sun 的 age 列到 city 列之間的資料
print(a.loc[['zhao', 'sun'], "age":"city"])
# 取位置 0 和 3 的資料
print(a.iloc[[0,3]])
# 取位置 0 到 2 的資料
print(a.iloc[0:3]) 
# 取第 1 行到第 3 行,第 1 列到第 2 列的資料
print(a.iloc[0:3, 0:2])
'''
      age gender
zhao   40      M
qian   25      F
sun    22      M
'''


# 取 age 大於 30 且 gender 是 M 的資料
#   & 和
#   | 或
#   ~ 非
print(a[(a.age>30) & (a.gender=='M')])
# 取 age 大於 30 的只包含 age 列的資料
print(a.loc[a.age>30, ["age"]])
# 取 city 為 beijing 或 shanghai 的資料
print(a[a.city.isin(["beijing", "shanghai"])])
# 取索引為 zhao 的資料
print(a[a.index.isin(["zhao"])])



# 以下用於演示如何對陣列做分組
# 依據 gender 分組
b = a.groupby("gender")
# 依據 gender 和 city 的聯合值分組
c = a.groupby(["gender", "city"])

# 獲取全部分組資料
print(b.groups) # {'F': ['qian', 'zhou'], 'M': ['zhao', 'sun', 'li']}
print(c.groups) # {('F', 'beijing'): ['qian'], ('F', 'shanghai'): ['zhou'], ('M', 'beijing'): ['zhao', 'li'], ('M', 'shanghai'): ['sun']}

# 遍歷分組
for name, group in b: 
    print(name)
    print(group) 
'''
F
      age gender      city
qian   25      F   beijing
zhou   28      F  shanghai
M
      age gender      city
zhao   40      M   beijing
sun    22      M  shanghai
li     28      M   beijing
'''

# 分組統計(更多功能需要藉助 numpy 庫,比如統計平均值可以用 numpy.mean)
# 統計不同 gender 分組的相同年齡的數量
print(b["age"].agg(len))
'''
gender
F    2
M    3
'''
# 統計不同 gender 分組的最大年齡
print(b["age"].agg(max))
'''
gender
F    28
M    40
'''

# 統計不同 gender 分組的年齡的累加值和最大值(可以指定統計後的列名)
print(b["age"].agg([sum, max]).rename(columns={"sum":"mySum", "max":"myMax"}))
'''
        mySum  myMax
gender
F          53     28
M          90     40
'''

# 支援同時對分組資料的不同欄位做統計(可以指定統計後的列名)
print(b.agg({"age":sum}).rename(columns={"age": "myAge"}))
'''
        myAge
gender
F          53
M          90
'''

速戰速決 Python https://github.com/webabcd/PythonSample
作者 webabcd