【问题标题】:Binning files based on the values in python根据python中的值对文件进行分箱
【发布时间】:2020-06-02 12:59:47
【问题描述】:

我正在尝试将这些值分箱到我的数据的一些自定义箱中。数据框中的 Coulmn1 由一大组随机数组成,范围从 1.4 到 1.9。 假设初始数据框如下所示:

Index    Col1
1        1.4678
2        1.5001
3        1.5795
4        1.5234 
...      ......
98       1.6754
99       1.6399
100      1.4910

我想要做的是将落在下面列出的箱的 +/- 0.002 范围内的数字分箱。即,我想对第一个 bin 中所有落在 1.458 和 1.462 范围内的数据进行 bin 处理。输出应该是这样的

Index    Col1       Bin_names
1        1.4678      NaN
2        1.5001      1.50
3        1.5795      1.58
4        1.5234      NaN
...      ......      ....
98       1.6754      NaN
99       1.6399      1.64
100      1.4910      NaN

我尝试了下面的代码,但它将 1.46 到 1.48 之间的所有数据分箱到一个箱中,这不是我想要的。

bins = [1.46,1.48,1.5,1.52,1.54,1.56,1.58,1.60,1.62,1.64,1.66,1.68,1.70]
df['Bin_names'] = pd.cut(df['Column1'], bins, labels=['1.48','1.5','1.52','1.54','1.56','1.58','1.60','1.62','1.64','1.66','1.68','1.70'])

如何根据我的要求对数据进行分类?

【问题讨论】:

  • 你能提供一个示例的预期输出吗?例如哪个 bin 落在 1.467 中?
  • @fmarm 我已经用最终数据框的外观更新了问题。

标签: python binning


【解决方案1】:

默认情况下,pd.cut() 的边界包含右边缘,因此您可以从标签“1.46”开始。

import pandas as pd
import numpy as np
import random
random.seed(10)

df = pd.DataFrame({'Col1':[round(random.uniform(1.450, 1.700),4) for i in range(100)]}, index=np.arange(1,101,1))

bins = [1.46,1.48,1.50,1.52,1.54,1.56,1.58,1.60,1.62,1.64,1.66,1.68,1.70]
labels = ['1.46','1.48','1.50','1.52','1.54','1.56','1.58','1.60','1.62','1.64','1.66','1.68']

df['Bin_names'] = pd.cut(df['Col1'], bins, labels=labels,right=False)
df.sort_values('Col1', inplace=True)
df2 = df.groupby('Bin_names').agg(list)
df3 = df2['Col1'].apply(pd.Series)
df3['cnt'] = df3.count(axis=1, numeric_only=True)
df3


       0    1   2   3   4   5   6   7   8   9   10  11  cnt
Bin_names                                                   
1.46    1.4611  1.4611  1.4657  1.4662  1.4700  1.4742  1.4782  1.4799  NaN NaN NaN NaN 8
1.48    1.4832  1.4835  1.4874  1.4891  1.4901  1.4912  1.4914  1.4916  1.4946  NaN NaN NaN 9
1.50    1.5015  1.5061  1.5104  1.5114  1.5125  1.5187  NaN NaN NaN NaN NaN NaN 6
1.52    1.5209  1.5257  1.5286  1.5299  1.5319  1.5329  1.5369  NaN NaN NaN NaN NaN 7
1.54    1.5415  1.5435  1.5454  1.5476  1.5503  1.5532  1.5535  1.5551  1.5572  1.5583  1.5587  1.5590  12
1.56    1.5603  1.5620  1.5639  1.5642  1.5654  1.5700  1.5723  1.5725  1.5742  NaN NaN NaN 9
1.58    1.5800  1.5802  1.5813  1.5834  1.5847  1.5872  1.5918  1.5929  1.5945  1.5957  1.5961  1.5962  12
1.60    1.6003  1.6005  1.6008  1.6033  1.6043  1.6122  1.6134  1.6145  1.6155  1.6183  1.6187  NaN 11
1.62    1.6215  1.6281  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2
1.64    1.6420  1.6439  1.6444  1.6519  1.6533  1.6545  1.6553  1.6559  NaN NaN NaN NaN 8
1.66    1.6610  1.6638  1.6650  1.6674  1.6745  1.6776  NaN NaN NaN NaN NaN NaN 6
1.68    1.6853  1.6869  1.6882  1.6922  1.6923  1.6956  1.6991  NaN NaN NaN NaN NaN 7

【讨论】:

    猜你喜欢
    • 2013-08-15
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 2022-08-12
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多