在每一行上应用函数是否检查行中每一列的条件并应用到所有列

问题描述

所有学分都归功于关于熊猫的 kaggle 课程 这里是 dataset.head() : enter image description here

这里的任务: 我们想在我们的网站上托管这些葡萄酒评论,但是 80 到 100 分的评分系统太难理解了——我们想将它们翻译成简单的星级评分。 95 分或更高为 3 星,85 分以上低于 95 分为 2 星。任何其他分数均为 1 星。

此外,加拿大葡萄酒商协会在该网站上购买了大量广告,因此任何来自加拿大的葡萄酒都应自动获得 3 星,无论积分如何。

使用与数据集中的每条评论相对应的星数创建一系列 star_ratings。

所以这里的解决方案:

def stars(row):
if row.country == 'Canada':
    return 3
elif row.points >= 95:
    return 3
elif row.points >= 85:
    return 2
else:
    return 1

star_ratings = review.apply(stars,axis='columns')

所以我的问题是:我想知道这个解决方案何时在每一行上执行应用函数。是否检查行中每一列的条件并将其应用于所有列,因为它没有指定仅在“点”列上执行

解决方法

有多种条件。一个适用于“国家”列的每一行,而另外两个适用于“点”列。带有 else 的“替代结果”是不满足任何条件。话虽如此,pandas 最好使用 np.select,以便您的解决方案高度矢量化(运行时间更快):

import numpy as np
star_ratings = np.select([(row.country == 'Canada') | (row.points >= 95),(row.points >= 85)],#condiitons
                         [3,3],#results
                          1)    #alternative result (like your else)

三个参数参数是条件(所有条件的列表)、结果(按条件顺序排列的结果列表)和替代结果。详情请见 numpy.select

,

创建示例 dataframe,然后使用您创建的相同函数,您只需执行 .apply() 即可获得所需的结果。

注意:这是一个示例数据集,您可以使用您自己的 wine 数据集,而不是在代码的第二行中创建它。

import pandas as pd
wine = pd.DataFrame({"country": ["Canada","US","Aus"],"points": [85,99,45]})

def stars(row):
    if row.country == 'Canada':
       return 3
    elif row.points >= 95:
       return 3
    elif row.points >= 85:
       return 2
    else:
       return 1

wine["stars"] = wine.apply(lambda x: stars(x),axis = 1)

说明.apply() 函数将任何给定的函数应用于 Pandas dataframe 的每一行/列。由于这里我们要应用到每一行,我们给了一个额外的参数 axis = 1,轴默认设置为 0(按列)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...