如何组合两列以使第三列按方法从组中获取属性?

Posted

技术标签:

【中文标题】如何组合两列以使第三列按方法从组中获取属性?【英文标题】:How to combine two columns to make a third column taking property from group by method? 【发布时间】:2016-12-23 18:04:49 【问题描述】:

不知道能不能把这个问题问清楚,不过这里我试试!

我有一个分类问题,我必须根据一个人的收入组来预测他的信用评分。我用过这段代码:

dta.groupby(['income_bracket'])['credit_score'].get_values()

现在我像往常一样有一个数据表,如下所示:

income_bracket  credit_scores    
    'very low'            0.0             2340
                          1.0              456
    'moderate'            0.0             1234 
                          1.0              657
        'high'            0.0               54
                          1.0              657
   'very high'            0.0                9
                          1.0             1234

解释:上面的数据是说,例如,一个信用评分为 0.0 的“非常低”收入阶层的人是 2340,信用评分为 1.0 的人是 456。

现在,有什么方法可以让我做类似的事情:如果一个人在收入范围内,那么预测他的信用评分将是 MAX(该收入范围内的信用评分)?例如,如果某人的收入等级为“高”,那么我可以预测他的 credit_score 将是 MAX(54,657) = 657 = 1.0

我想要的期望输出:newdata --> income_group = 'high' ---> credit_score = 1(因为我知道在高收入组中,MAX 值为 657,属于 1.0 的信用评分

请帮助我实现这一目标。

【问题讨论】:

【参考方案1】:

您需要idxmax 来获取每个组的index 值,其中最大值在val 中,然后通过ix 选择这些行:

#dta.reset_index(inplace=True)
#dta = dta.reset_index().rename(columns=0: 'val') 
print (dta)
  income_bracket  credit_score   val
0       very low           0.0  2340
1       very low           1.0   456
2       moderate           0.0  1234
3       moderate           1.0   657
4           high           0.0    54
5           high           1.0   657
6      very high           0.0     9
7      very high           1.0  1234
print (dta.groupby(['income_bracket'], sort=False)['val'].idxmax())
income_bracket
very low     0
moderate     2
high         5
very high    7
Name: val, dtype: int64

#select all columns
print (dta.ix[dta.groupby(['income_bracket'], sort=False)['val'].idxmax()])
  income_bracket  credit_score   val
0       very low           0.0  2340
2       moderate           0.0  1234
5           high           1.0   657
7      very high           1.0  1234

#select columns income_bracket and credit_score
print (dta.ix[dta.groupby(['income_bracket'], sort=False)['val'].idxmax(), 
             ['income_bracket','credit_score']])
  income_bracket  credit_score
0       very low           0.0
2       moderate           0.0
5           high           1.0
7      very high           1.0

#select column credit_score    
print (dta.ix[dta.groupby(['income_bracket'], sort=False)['val'].idxmax(), 'credit_score'])
0    0.0
2    0.0
5    1.0
7    1.0
Name: credit_score, dtype: float64

【讨论】:

我简化了这个问题,实际问题有大约 20 个不同的收入等级,现在我得到了代码,但我无法到达最后一点,我确实找到了 val 如您所定义,但如何获取新数据点并与其收入组匹配并获得最终信用评分? 您能否将输入中的所需输出添加到问题中?我不确定我是否理解正确。 我也认为 val 的使用给我带来了一些问题,名称 val 不存在 groupby 函数它只是数字,使用时没有命名列groupby ,但我非常感谢你 :) 那么您是否需要包含值0,0,0,0,1,1,1,1(加上.0)的广告新列? yaa 完全正确,但不是 '0,0,0,0,1,1,1,1' 而是 '0,0,1,1' 你看到每个收入组有两个信用评分,但我只想要一个最高计数的信用评分。

以上是关于如何组合两列以使第三列按方法从组中获取属性?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使表格的前两列与其内容一样宽,而第三列占据剩余空间?

如何将所有行的两列总和为第三列

在SQL中,如何将两列的数据相乘以获得第三列

如何使三列按目标数排序?

如何对两列求和并通过减去它们的聚合 SQL 和 C# 在第三列中显示结果?

Pandas:将依赖于第三列的相同数据框的两列相乘