【问题标题】:How to merge two bins in a pandas data frame?如何合并熊猫数据框中的两个箱?
【发布时间】:2021-12-06 19:11:35
【问题描述】:

我正在使用 pd.cut 和分箱数据。在这一步之后,我找到了每个 bin 中数据的平均值,如果两个 bin 之间的平均值差异低于阈值,我想将两个 bin 合并在一起。


import pandas as pd
df = pd.DataFrame([{ 'col1': 7, 'val': 2},
                   {'col1':   20, 'val': 22},
                   {'col1':  11, 'val': 12},
                   { 'col1': 9, 'val': 13},
                   { 'col1':   14, 'val': 11}])


df['bin1']=pd.cut(df['col1'], 3)

df2 = pd.DataFrame(df.groupby('bin1')['val'].mean())

threshold = 5

输出:


                   val
bin1    
(6.987, 11.333]     9
(11.333, 15.667]    11
(15.667, 20.0]      22

如果 val 的均值差小于阈值 (5),那么我想合并 bin。

所以现在的新垃圾箱应该是:

                 
bin1    
(6.987, 15.667]     
(15.667, 20.0]      

我不知道怎么做最后一步.. 谢谢!

【问题讨论】:

  • bin 是否必须连续才能合并?如果两个以上的 bin 在彼此的均值范围内,您会怎么做,它们会合并在一起吗?
  • 如果最后一个 bin 的意思是 15,这比第二个 bin 多 4。你会将它与前两个 bin 合并吗?
  • @mitoRibo:是的,bin 需要连续才能合并。
  • @QuangHoang:我比较了相邻的垃圾箱。当然,当我合并垃圾箱时,平均值会有所变化。但通常情况下,我在数据中看到的 bin 之间的平均值差异要么非常小,要么非常大。所以我必须相应地选择一个阈值

标签: python pandas dataframe cut bin


【解决方案1】:

合并连续行的常用技术是处理否定条件的累积。在这里,那就是:

blocks = df2['val'].diff().gt(threshold).cumsum()

但是,由于您正在使用索引,因此最好将其重置,以便我们可以处理列:

df2 = df2.reset_index()
blocks = df2['val'].diff().gt(threshold).cumsum()
df2.groupby(blocks).agg({
    'bin1': lambda x: pd.Interval(x.iloc[0].left, x.iloc[-1].right)
})

输出:

                bin1
val                 
0    (6.987, 15.667]
1     (15.667, 20.0]

【讨论】:

  • 非常感谢.. 没想到这一点让我很郁闷!! :)
猜你喜欢
  • 1970-01-01
  • 2017-06-11
  • 2016-01-01
  • 2017-09-02
  • 1970-01-01
相关资源
最近更新 更多