Pandas - 数据的聚合与分组计算

1 数据分组 - groupby()1.1 按照多列进行分组的两种方法1.2 对分组进行迭代1.3 将列数据按照数据类型进行分组1.4 通过字典或者Series对DataFrame数据进行分组2 数据聚合2.1 分组结果的内置聚合函数2.2 自定义聚合函数2.3 apply函数自定义函数利用apply应用到分组对象上2.4 分组加权平均数和相关系数...
摘要由CSDN通过智能技术生成


1 数据分组 - groupby()

分组原理

from pandas import DataFrame,Series
import pandas as pd
import numpy as np
from numpy import nan as NA
df = DataFrame({
  "key1":list("aabba"),
               "key2":["one","two","one","two","one"],
               "data1":np.random.randn(5),
               "data2":np.random.randn(5)})
df
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
data1 data2 key1 key2
0 0.008908 0.652712 a one
1 0.438874 0.423774 a two
2 0.299105 -1.279888 b one
3 -0.191032 0.429504 b two
4 -0.395208 0.523417 a one
# 对数据按照key1进行分组
# groupby 只进行分组,不会进行任何的计算操作
grouped = df["data1"].groupby(df["key1"]) 
grouped.count()  # 根据分组结果,计算每个分组下元素的个数
    key1
    a    3
    b    2
    Name: data1, dtype: int64
grouped.max()   # 根据分组结果,计算每个分组下的最大值
    key1
    a    0.438874
    b    0.299105
    Name: data1, dtype: float64
grouped.size()
    key1
    a    3
    b    2
    Name: data1, dtype: int64
grouped.mean()
    key1
    a    0.017525
    b    0.054036
    Name: data1, dtype: float64
grouped.describe()
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
count mean std min 25% 50% 75% max
key1
a 3.0 0.017525 0.417108 -0.395208 -0.193150 0.008908 0.223891 0.438874
b 2.0 0.054036 0.346579 -0.191032 -0.068498 0.054036 0.176571 0.299105
df
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
data1 data2 key1 key2
0 0.008908 0.652712 a one
1 0.438874 0.423774 a two
2 0.299105 -1.279888 b one
3 -0.191032 0.429504 b two
4 -0.395208 0.523417 a one

1.1 按照多列进行分组的两种方法

# 按照多列进行分组
# 先获取某一列的所有值,再按照key1和key2进行分组
grouped1 = df["data1"].groupby([df["key1"],df["key2"]]) 
grouped1.mean()
    key1  key2
    a     one    -0.193150
          two     0.438874
    b     one     0.299105
          two    -0.191032
    Name: data1, dtype: float64
# 先将所有的数据按照key1和key2进行分组,再获取分组结果data1或者data2的分组结果
group_all = df.groupby(["key1","key2"])
# 获取data1的分组结果
group_all["data1"].mean()
    key1  key2
    a     one    -0.193150
          two     0.438874
    b     one     0.299105
          two    -0.191032
    Name: data1, dtype: float64
# 获取data2的分组结果
group_all["data2"].mean()
    key1  key2
    a     one     0.588065
          two     0.423774
    b     one    -1.279888
          two     0.429504
    Name: data2, dtype: float64
df
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
data1 data2 key1 key2
0 0.008908 0.652712 a one
1 0.438874 0.423774 a two
2 0.299105 -1.279888 b one
3 -0.191032 0.429504 b two
4 -0.395208 0.523417 a one
# 按照key1将所有的数据进行分组
group_key1 = df.groupby(["key1"])

1.2 对分组进行迭代

# 通过循环遍历已分组对象中的每一个组别数据
for name,group in group_key1:
    print("组别:",name)
    print("数据:\n",group)
    组别: a
    数据:
           data1     data2 key1 key2
    0  0.008908  0.652712    a  one
    1  0.438874  0.423774    a  two
    4 -0.395208  0.523417    a  one
    组别: b
    数据:
           data1     data2 key1 key2
    2  0.299105 -1.279888    b  one
    3 -0.191032  0.429504    b  two

1.3 将列数据按照数据类型进行分组

# 查看DataFrame中每一列的数据类型
df
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
data1 data2 key1 key2
0 0.008908 0.652712 a one
1 0.438874 0.423774 a two
2 0.299105 -1.279888 b one
3 -0.191032 0.429504 b two
4 -0.395208 0.523417 a one
df.dtypes
    data1    float64
    data2    float64
    key1      object
    key2      object
    dtype: object
# 将列数据按照数据类型进行分组
group_types = df.groupby(df.dtypes,axis=1)
  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值