【问题标题】:Symmetric number of bins in qcut around zeroqcut 中大约为零的对称 bin 数量
【发布时间】:2018-07-20 15:28:25
【问题描述】:

我有一个熊猫数据框,每行有不同数量的整数和NaNs。我想将每行中的值分配到 8 个箱中 - 每行 4 个箱用于负值,4 个箱用于正值。因此,每行的每个 bin 中会有不同数量的值。有关如何为此调整 qcut 功能的任何提示?谢谢!

【问题讨论】:

  • 只是检查一下,您指的是 Pandas 数据框吗?
  • 是的,完全正确。抱歉没有说明。

标签: python pandas binning


【解决方案1】:

如果我理解正确,您可以对正值执行 qcut,对负值执行 qcut。

例如,给定数据框:

>>> df
        vals
0  -0.456460
1   0.448368
2   0.186750
3   1.056617
4  -0.035620
5  -0.609843
6   0.126376
7   0.160817
8  -1.495441
9   0.730763
10 -0.005071
11  0.677918
12 -0.779553
13  0.717374
14  2.250258
15 -0.801028
16  0.306408
17  0.538970
18 -2.120528
19  1.066903

使用 2 个qcuts,一个为正,一个为负。

df.loc[df.vals > 0,'bin'] = pd.qcut(df.loc[df.vals > 0,'vals'], q=4)

df.loc[df.vals < 0,'bin'] = pd.qcut(df.loc[df.vals < 0,'vals'], q=4)

因此,它们被分成 8 个不同的 bin,4 个用于正例,4 个用于负例:

>>> df
        vals                 bin
0  -0.456460    (-0.695, -0.351]
1   0.448368      (0.276, 0.608]
2   0.186750      (0.125, 0.276]
3   1.056617       (0.812, 2.25]
4  -0.035620  (-0.351, -0.00507]
5  -0.609843    (-0.695, -0.351]
6   0.126376      (0.125, 0.276]
7   0.160817      (0.125, 0.276]
8  -1.495441    (-2.122, -0.975]
9   0.730763      (0.608, 0.812]
10 -0.005071  (-0.351, -0.00507]
11  0.677918      (0.608, 0.812]
12 -0.779553    (-0.975, -0.695]
13  0.717374      (0.608, 0.812]
14  2.250258       (0.812, 2.25]
15 -0.801028    (-0.975, -0.695]
16  0.306408      (0.276, 0.608]
17  0.538970      (0.276, 0.608]
18 -2.120528    (-2.122, -0.975]
19  1.066903       (0.812, 2.25]

您可以像这样对 bin 进行排序以将它们可视化,这样您就可以看到 4 个 bin 表示正值,4 个 bin 表示负值:

np.sort(df['bin'].unique())

array([Interval(-2.1219999999999999, -0.97499999999999998, closed='right'),
       Interval(-0.97499999999999998, -0.69499999999999995, closed='right'),
       Interval(-0.69499999999999995, -0.35099999999999998, closed='right'),
       Interval(-0.35099999999999998, -0.0050699999999999999, closed='right'),
       Interval(0.125, 0.27600000000000002, closed='right'),
       Interval(0.27600000000000002, 0.60799999999999998, closed='right'),
       Interval(0.60799999999999998, 0.81200000000000006, closed='right'),
       Interval(0.81200000000000006, 2.25, closed='right')], dtype=object)

【讨论】:

  • 如何逐行执行此操作?当我尝试这个时:quintiles_df=df.apply(lambda x: qcut(df.loc[df&gt;0], q=4), axis=1),我收到一个错误:raise NotImplementedError("Indexing a MultiIndex with a "NotImplementedError: ('Indexing a MultiIndex with a DataFrame key is not implemented', '发生在索引 (10, 2012-09-25 10:20:00)')
  • 很难准确地说出您要做什么。您可以发布一个最小示例作为对您问题的修改吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 2016-05-13
  • 2012-08-25
  • 2013-12-08
  • 2016-08-21
  • 1970-01-01
  • 2018-01-07
相关资源
最近更新 更多