V1 V2
0.5 2
0.8 13
0.7 5
0.9 25
1.2 4
...
请问如何按照区间对V2分组(统计最大值到最小值,分成n个区间),统计每个区间中所有V1值的平均数
V1 V2
0.5 2
0.8 13
0.7 5
0.9 25
1.2 4
...
请问如何按照区间对V2分组(统计最大值到最小值,分成n个区间),统计每个区间中所有V1值的平均数
对 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.cut
和groupby
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
4 回答4.5k 阅读✓ 已解决
1 回答3.5k 阅读✓ 已解决
4 回答3.9k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答528 阅读✓ 已解决
1 回答4.6k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
binning的部分可以用 case_when
是不是 R 的代码比上面的 更用户友好点。