如何使用pandas DataFrame进行大于/小于binning?

时间:2017-04-08 23:03:50

标签: python pandas dataframe binning

我有一个pandas DataFrame如下:

$compileProvider

现在,让我们说我想创建第四列,使用sudo apt-get install openjfx 显示第三列的分类。在这里,我标记每一行import pandas as pd import numpy as np data = {"first_column": ["item1", "item2", "item3", "item4", "item5", "item6", "item7"], "second_column": ["cat1", "cat1", "cat1", "cat2", "cat2", "cat2", "cat2"], "third_column": [5, 1, 8, 3, 731, 189, 9]} df = pd.DataFrame(data) df first_column second_column third_column 0 item1 cat1 5 1 item2 cat1 1 2 item3 cat1 8 3 item4 cat2 3 4 item5 cat2 731 5 item6 cat2 189 6 item7 cat2 9 中的元素是否小于或等于10 pandas.cut()

third_column

结果数据框现在是:

<=10

问题:请注意第二列df["less_than_ten"]= pd.cut(df.third_column, [-np.inf, 10, np.inf], labels=(1,0)) ,其中包含类别 first_column second_column third_column less_than_ten 0 item1 cat1 5 1 1 item2 cat1 1 1 2 item3 cat1 8 1 3 item4 cat2 3 1 4 item5 cat2 731 0 5 item6 cat2 189 0 6 item7 cat2 9 1 second_column。我如何使用cat1根据&#34;类&#34;重新分类这些值?在cat2

更重要的是,让我说我想要更复杂的间隔,例如小于或等于500 le(500)且大于或等于20 ge(20)?怎么做?在这种情况下,应该通过分组标记1:

pandas.cut()

2 个答案:

答案 0 :(得分:1)

在这种情况下,我不会使用pd.cut

df['less_than_ten'] = df.third_column.le(10).astype(np.uint8)
df.loc[df.second_column=='cat2','less_than_ten'] = \
    df.loc[df.second_column=='cat2','third_column'].le(10).astype(np.uint8) + 2

结果:

In [99]: df
Out[99]:
  first_column second_column  third_column  less_than_ten
0        item1          cat1             5              1
1        item2          cat1             1              1
2        item3          cat1             8              1
3        item4          cat2             3              3
4        item5          cat2           731              2
5        item6          cat2           189              2
6        item7          cat2             9              3

答案 1 :(得分:1)

虽然完全理解我提出的解决方案看起来像黑客并提供与您不同的数字,但我仍然在这里提供:

df['less_than_ten'] = (df.second_column=='cat1').astype(int) +\
                      (df.third_column<10).astype(int)  
#  first_column second_column  third_column  less_than_ten
#0        item1          cat1             5              2
#1        item2          cat1             1              2
#2        item3          cat1             8              2
#3        item4          cat2             3              1
#4        item5          cat2           731              0
#5        item6          cat2           189              0
#6        item7          cat2             9              1

您可以使括号中的条件任意复杂,只要它们是布尔值(True / False)。