根据条件

时间:2017-12-13 21:33:15

标签: python division calculated-columns

我100%知道我做错了,语法搞砸但可以使用一些帮助。

我的最后一行代码很好(es_rl [' percent_complete'] = es_rl ['已实现'] / es_rl ['目标'])但是孩子们我可以实现超过目标的目标,而且我不想创建一个高于1的百分比。我试图编写一个只根据' Achieved'来划分两列的功能。列,并希望将结果按行传递到' percent_complete'。这可能吗?

我使用sqlalchemy来提取数据,所以也许有一个更好的解决方案只使用sql。我只是想在python上变得更好。提前谢谢。

编辑,尝试使用min函数。获得ValueError。

es_rl['percent_complete'] = min(es_rl['Achieved']/es_rl['Goal'], 1)

Data columns (total 5 columns):
scholar_id    12243 non-null int64
Goal          12243 non-null float64
Achieved      11263 non-null float64
GoalYear      12243 non-null int64
GoalWeek      12243 non-null int64
dtypes: float64(2), int64(3)

2 个答案:

答案 0 :(得分:3)

为什么不使用内置的min()来确保您的百分比永远不会高于1

es_rl['percent_complete'] = min(es_rl['Achieved']/es_rl['Goal'], 1)

更新:您应该告诉我们您正在使用Pandas数据帧。然后你应该使用pandas.Series.clip(),例如:

es_rl['percent_complete'] = (es_rl['Achieved'] / es_rl['Goal']).clip(0, 1)

es_rl['percent_complete'] = es_rl['Achieved'].clip(0, es_rl['Goal']) / es_rl['Goal']

答案 1 :(得分:0)

如果您从SQLAlchemy中提取数据,则可以使用Case语句:

- 假设您的表名为Scholar

    def case_percent_complete():
        return case([((Scholar.Achieved / Scholar.Goal) > 1, 1), ],
                    else_=Scholar.Achieved / Scholar.Goal).label('percent_complete')

    results = session().query(Scholar.scholar_id
                                Scholar.Goal
                                Scholar.Achieved
                                Scholar.GoalYear
                                Scholar.GoalWeek,
                                case_percent_complete).\
            all()