【问题标题】:Pandas Group 2-D NumPy Data by Range of ValuesPandas 按值范围对二维 NumPy 数据进行分组
【发布时间】:2019-06-20 03:04:21
【问题描述】:

我有一个二维数组形式的大型数据集。二维数组表示连续的强度数据,我想用它来创建另一个相同大小的二维数组,只是这一次,这些值被分组为离散值。换句话说,如果我有一个像这样的二维数组,

[(11, 23, 33, 12),
 (21, 31, 13, 19),
 (33, 22, 26, 31)]

输出将如下所示,其中 10 到 19 的值分配给 1,20 到 29 的值分配给 2,30 到 39 的值分配给 3。

[(1, 2, 3, 1),
 (2, 3, 1, 1),
 (3, 2, 2, 3)]

更理想的是,我想根据百分位数进行这些分配。例如,前 10% 的值分配给 5,前 20 的值分配给 4,依此类推。

我的数据集是 NumPy 格式。我查看了函数groupby,但这似乎不允许我指定范围。我还查看了cut,但是 cut 仅适用于一维数组。我考虑过在遍历每一行数据时通过循环运行 cut 函数,但我担心这可能会花费太多时间。我的矩阵可以是 4000 行乘 4000 列。

【问题讨论】:

  • 你真的希望你的输出是这样的元组,还是只使用一个常规数组就可以了
  • 正常数组@user3483203

标签: python pandas grouping


【解决方案1】:

您需要 stack 数据框以具有一维表示,然后应用 cut。之后你可以unstack它。

[tuple(x) for x in (pd.cut(pd.DataFrame(a).stack(), bins=[10,20,30,40], labels=False)+1).unstack().values]

OR(使用@user3483203 的魔法)

[tuple(x) for x in np.searchsorted([10, 20, 30, 40], np.array(a))]

输出:

[(1, 2, 3, 1), 
 (2, 3, 1, 1), 
 (3, 2, 2, 3)]

【讨论】:

  • np.searchsorted([10, 20, 30, 40], np.array(a))
  • @user3483203,你做的简单多了。谢谢。
  • 发现你可以通过设置 b=np.percentile(zData, [0,97,98,99.8,100]) 并让 bins = b 来做百分比的事情。和类似的替换 @user3483203 的版本。谢谢
  • 当我将结果分配给另一个变量时,这两种解决方案都适用于 numpy 数组。原始数据框具有列标题和行标题,我尝试在原始格式上执行此操作,以查看是否可以保留标题中的信息。我现在能想到的唯一方法是创建一个新的数据框并复制航向信息以及分组的强度二维数组。不知道有没有更好的办法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 2013-08-17
  • 2013-04-27
  • 1970-01-01
  • 2015-09-04
  • 2023-02-08
  • 1970-01-01
相关资源
最近更新 更多