根据索引的接近程度拆分熊猫数据框

Posted

技术标签:

【中文标题】根据索引的接近程度拆分熊猫数据框【英文标题】:Split pandas dataframe based on proximity of the index 【发布时间】:2018-03-14 10:32:19 【问题描述】:

我有一个大的索引数据框,我想根据它们的索引对其进行分组。数据索引如下:

Index 
...    
79228         
79230         
79232         
101930      
101932      
101934
101936
101938      
147224      
147226      
147228
147230
...    

应该如何分组:

Index     group_id
...
79228     1  
79230     1    
79232     1    
101930    2  
101932    2  
101934    2
101936    2
101938    2  
147224    3  
147226    3  
147228    3
147230    3
...

一种选择是使用 DataFrame.iterrows() 遍历每一行并比较索引,但这似乎非常低效。有没有一种可以更有效地做到这一点的 pandas 方式?

注意:同一范围内索引的数量和值是随机的,所以我不能这样分组。

数据以大数字分隔。例如一个索引是 80 000,下面是 100 000。

【问题讨论】:

您如何区分索引?你有一个组 id 应该重复的次数吗? 我根据它们之间的距离来区分索引。例如:if (bigger_index -smaller_index 在阅读了所有 cmets 之后,我认为您的问题更多的是关于分组,而不是关于 pandas。 @jpp's answer照顾所有的熊猫,并且大部分可以适应您想要分组的任何简单方法。如果不能通过简单的方法完成,那么您可能需要使用big guns。 【参考方案1】:

这是设置容忍度的一种方法。在这里,我们计算底商乘以 100 并进行因式分解。

df['NewIndex'] = (df['Index'].diff() > 100).cumsum() + 1

#    Index  NewIndex
# 0      1         1
# 1      3         1
# 2      8         1
# 3   1003         2
# 4   1005         2
# 5   1006         2
# 6   3005         3
# 7   3010         3
# 8   3016         3

说明

查找差异高于阈值的行,例如100. 使用pd.Series.cumsum() 将这些标记滚动到组中。 为所需的输出加 1。

【讨论】:

感谢您的回答,但我认为基于商的方法行不通,因为索引值是完全任意的。我更新了问题中的数据以更好地反映这一点。 @M9M5M,我用你的新数据进行了测试。它仍然有效。建议你再更新一次! 如果数据由可预测的数据阈值(例如 100)分隔,则此方法有效,但对于数组 = 199, 200, 201, 333, 334, 335,199 将在不同的组中200 和 201,还是我错过了什么? 像魅力一样工作!感谢您的补充说明。

以上是关于根据索引的接近程度拆分熊猫数据框的主要内容,如果未能解决你的问题,请参考以下文章

根据字符串+数字的索引对熊猫数据框进行排序

根据不均匀的日期重新索引熊猫数据框,然后用 groupby 和空白填充某些值

按给定列表的顺序选择重复的熊猫数据框行并保留原始索引

熊猫根据索引标签选择特定列中的值[重复]

根据熊猫中的索引范围组合列的行

根据单词是不是大写拆分熊猫数据框列