【问题标题】:How to make a new dataframe to store the average values of the original dataframe's columns' bins?如何制作一个新的数据框来存储原始数据框列的 bin 的平均值?
【发布时间】:2019-01-15 06:44:50
【问题描述】:

假设我有一个数据框,df:

>>> df

Age    Score
19     1
20     2
24     3
19     2
24     3
24     1
24     3
20     1
19     1
20     3
22     2
22     1

我想构建一个新的数据框,将Age 分箱并将其平均分存储在Score 中:

Age       Score
19-21     1.6667
22-24     2.1667

这是我的做法,我觉得有点复杂:

import numpy as np
import pandas as pd

data = pd.DataFrame(columns=['Age', 'Score'])
data['Age'] = [19,20,24,19,24,24,24,20,19,20,22,22]
data['Score'] = [1,2,3,2,3,1,3,1,1,3,2,1]

_, bins = np.histogram(data['Age'], 2)

df1 = data[data['Age']<int(bins[1])]
df2 = data[data['Age']>int(bins[1])]

new_df = pd.DataFrame(columns=['Age', 'Score'])
new_df['Age'] = [str(int(bins[0]))+'-'+str(int(bins[1])), str(int(bins[1]))+'-'+str(int(bins[2]))]
new_df['Score'] = [np.mean(df1.Score), np.mean(df2.Score)]

除了冗长之外,这种方式不适用于更多的 bin(因为我们需要在 new_df 中为每个 bin 编写每个条目)。

有没有更有效、更干净的方法?

【问题讨论】:

    标签: python pandas dataframe grouping binning


    【解决方案1】:

    使用 cut 将 bin 值转换为离散区间,最后聚合 mean:

    bins = [19, 21, 24]
    #dynamically create labels
    labels = ['{}-{}'.format(i + 1, j) for i, j in zip(bins[:-1], bins[1:])] 
    labels[0] = '{}-{}'.format(bins[0], bins[1])
    print (labels)
    ['19-21', '22-24']
    
    binned = pd.cut(data['Age'], bins=bins, labels=labels, include_lowest=True)
    df = data.groupby(binned)['Score'].mean().reset_index()
    print (df)
         Age     Score
    0  19-21  1.666667
    1  22-24  2.166667
    

    【讨论】:

      猜你喜欢
      • 2016-11-14
      • 2020-11-02
      • 2019-01-20
      • 2020-11-09
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      相关资源
      最近更新 更多