使用map()时出错:根据另一列中的值创建新的pandas列

时间:2017-11-02 15:14:27

标签: python python-3.x pandas lambda

我应该通过将此列('%Renewable')的值与同一列的中值进行比较来创建新的pandas列。结果应该构成一个新专栏。

当然我可以用for循环来做到这一点。虽然我只是在学习的开始,但我想更多地使用map,lambda等方法。

因此我尝试了这个:

def above(x,y):
if x>=y:
    return 1
else:
    return 0

def answer_ten():
  Top15 = answer_one() #loads the dataframe and formats it

  Median=Top15['% Renewable'].median()

  Top15['HighRenew']=map(above, Top15['% Renewable'], Top15['% Renewable'].median()

# one try: list(map(above, (Top15['% Renewable'], Top15['% Renewable'].median())))  
# one more try: [*map(above, (Top15['% Renewable'], Top15['% Renewable'].median()))]  

return  Top15['HighRenew']

但是我没有得到错误的值:'float'对象不可迭代

我试着在评论专栏中听取替代方案,我从另一篇文章中得到了这些内容:Getting a map() to return a list in Python 3.x

到目前为止,我想出了一个不同的单行解决方案:

Top15['HighRenew']=(Top15['% Renewable']>=Top15['% Renewable'].median()).astype('int')

但我想知道如何使用Lambda或map()或filter(?)以不同的方式(当然更长)。

有人能指出我的另类解决方案吗?

感谢。

2 个答案:

答案 0 :(得分:1)

您可能只想要above(Top15['% Renewable'], Top15['% Renewable'].median())map接受一系列对象并将函数应用于每个对象,但您只想应用一次。您得到的错误是因为您传入的两个值无法循环。

答案 1 :(得分:0)

所以你基本上想要这样的东西:

Top15['HighRenew'] = Top15.apply(lambda df: int(df['% Renewable'] >= Top15['% Renewable'].median()))