我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)
答案 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()