速战速决 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

posted @ 2022-01-20 16:25  webabcd  阅读(354)  评论(0编辑  收藏  举报