【问题标题】:Create bins from spacial data in Python pandas - possibly using groupby, diff, and cut?从 Python pandas 中的空间数据创建 bin - 可能使用 groupby、diff 和 cut?
【发布时间】:2021-07-29 06:20:19
【问题描述】:

我无法为以下问题想出一个好的解决方案。请分享您的想法。

我正在尝试将 X、Y 空间数据(存储桶的物理位置)映射到 pandas 中的类别 / groupby 对象。每个桶之间在物理上都有空间,因此相似桶的数据点很接近,独特的桶之间有更大的空间。桶在两个平面 X 和 Y 中物理隔开,并且在其中具有不同数量的点。为简单起见,下面仅显示 X:

df = pd.DataFrame([0,1,2,6,7,8,12,13,14],columns=['X']) 
df['Xdiff'] = df['X'].diff() #Get Diff


    X   Xdiff
0   0   NaN
1   1   1.0
2   2   1.0
3   6   4.0
4   7   1.0
5   8   1.0
6   12  4.0
7   13  1.0
8   14  1.0

我想要一个 groupby 对象,它的第一组是数据索引位置 0-2,第二组是 3-5,第三组是 6-8。如下所示

grp1.index = [0,1,2]
grp2.index = [3,4,5]
grp2.index = [6,7,8]

我尝试过 cut 和 groupby,但没有成功:

new_bins = df[ (df['Xdiff'] > 1) ] #Get larger diff values

X   Xdiff
3   6   4.0
6   12  4.0

bins = pd.cut( df['X'], new_bins['Xdiff'])

0            NaN
1            NaN
2            NaN
3            NaN
4    (6.0, 12.0]
5    (6.0, 12.0]
6    (6.0, 12.0]
7            NaN
8            NaN
Name: X, dtype: category
Categories (1, interval[float64]): [(6.0, 12.0]]

感谢您的帮助。谢谢!

更新: 我现在正在努力在 pandas 之外添加组,然后是 groupby:

groups = []
for d in df['Xdiff']:
    if d < 4:
        groups.append(i)
    else:
        i+=1
        groups.append(i)
df['bin'] =groups

df.groupby('bin').count()

然后输出: 这行得通,但我相信熊猫一定有更好的方法。谢谢!

    X   Xdiff
bin     
1   3   2
2   3   3
3   3   3

【问题讨论】:

  • 你希望你的输出是什么样的?
  • 我想要一个带有每个垃圾箱的 groupby 对象。
  • 为了清楚起见,您实际上并不需要间隔,您只是想将连续的值组合在一起?
  • 没错,将连续的区间组合在一起。抱歉,我也无法表达清楚;谢谢你!

标签: python pandas pandas-groupby


【解决方案1】:

让我们尝试在 Xdiff 上使用布尔逻辑来创建组:

import pandas as pd

df = pd.DataFrame([0, 1, 2, 6, 7, 8, 12, 13, 14], columns=['X'])
df['Xdiff'] = df['X'].diff()
# Create Bins Based on Where Xdiff is Not 1
df['bin'] = df['Xdiff'].fillna(1).ne(1).cumsum() + 1

# Groupby on new index 'bin'
df = df.groupby('bin').agg('count')
print(df)

输出:

     X  Xdiff
bin          
1    3      2
2    3      3
3    3      3

【讨论】:

  • 不错! +1 但我认为你可以做df = df.groupby('bin').agg('count')?还是有什么不同?
  • 我相信df.groupby('bin').agg('count') 会产生相同的命名轴,至少在我这边是这样
  • 绝对正确。我在测试时有as_index=False。感谢并更新!
  • 我喜欢这个。我将在我的真实数据集上使用它,并检查是否一切顺利。感谢您在这里分享心声。 .ne 对我来说是新的,你帮了很多忙。这看起来更像熊猫,而且比我的循环好得多!
  • 我喜欢你的方法,但是它不适用于我的真实数据集,因为值不完全是 1。对于连续数据,它们可能在 0.8-1.5 之间变化,但是新的存储桶有差异6-15。所以我认为代替 .ne(1) 我会改为一些
猜你喜欢
  • 2019-06-20
  • 2017-07-05
  • 1970-01-01
  • 2020-11-12
  • 2020-09-28
  • 2021-11-20
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
相关资源
最近更新 更多