如何对某一列自动分组,统计求和

V1 V2
0.5 2
0.8 13
0.7 5
0.9 25
1.2 4
...

请问如何按照区间对V2分组(统计最大值到最小值,分成n个区间),统计每个区间中所有V1值的平均数

阅读 12k
3 个回答

binning的部分可以用 case_when

library(tidyverse)

data %>%
mutate(V2 = case_when(V2 %>% between(0,1) ~ "0-1",
                      V2 %>% between(1,2) ~ "0-2",
                      TRUE ~ ">=3") %>%
group_by(V2) %>%
summarize(mean_value = mean(V1))

是不是 R 的代码比上面的 更用户友好点。

对 v2 列分组,映射成分组 ID 列,然后做平均值统计便可。

请参考以下代码

'''
按区间对某列做分组,然后统计各组的另一列的平均值。

author: 李毅
'''
import numpy as np
import pandas as pd


df = pd.DataFrame([
    [0.1, 1],
    [0.2, 2],
    [0.3, 3],
    [0.4, 4],
    [0.5, 5],
    [0.6, 6],
], columns=['v1', 'v2'])


# 对列 v2 分组。
# 除了 np.histogram ,还可以用等距法等分区间,这取决于你的业务需求。
ranges = np.histogram(df.v2.values, 3)[1]


def tag_v2(value, ranges):
    ''' 用分组 ID 对 v2 值做标签。 '''
    for i in range(len(ranges) - 1):
        if value >= ranges[i] and value <= ranges[i+1]:
            return i
    return -1


# 添加 v2 标签列。
df['v2_tag'] = df.v2.apply(lambda i: tag_v2(i, ranges))

print df

输出结果

      v1    v2    v2_tag
0    0.1    1    0
1    0.2    2    0
2    0.3    3    1
3    0.4    4    1
4    0.5    5    2
5    0.6    6    2

统计平均值

print df.groupby('v2_tag')['v1'].mean()

输出结果

     v2_tag
0    0.15
1    0.35
2    0.55
Name: v1, dtype: float64

使用pandas.cutgroupby

import pandas as pd
from io import StringIO

s = """
V1,V2
0.5,2
0.8,13
0.7,5
0.9,25
1.2,4"""

df = pd.read_csv(StringIO(s))

# 假设分成10组
step = (df.V2.max - df.V2.min)/10
bins = [df.V2.min() + i * step for i in range(11)]
result = df.groupby(pd.cut(df.V2, bins)).V1.mean()

输出:

V2
(2.0, 4.3]      1.2
(4.3, 6.6]      0.7
(6.6, 8.9]      NaN
(8.9, 11.2]     NaN
(11.2, 13.5]    0.8
(13.5, 15.8]    NaN
(15.8, 18.1]    NaN
(18.1, 20.4]    NaN
(20.4, 22.7]    NaN
(22.7, 25.0]    0.9
Name: V1, dtype: float64
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题