Python 如何基于其他三列之一创建新列?

Python 如何基于其他三列之一创建新列?,python,pandas,Python,Pandas,我有一个数据框,它有一个电影名称列和3个其他列(我们称它们为a、B和C),它们是来自3个不同来源的评级。 有很多电影只有一个评级,一些电影是三个论坛的组合,还有一些没有评级。我想创建一个新列,该列将: 如果列具有关联的额定值,请使用A 如果列为空,则从B获取相关的评级 如果B列为空,则从C获取相关评级 如果C列为空,则返回“未分级” 这是我目前代码中的内容: def check_rating(rating): if newyear['Yahoo Rating'] != "\\N":

我有一个数据框,它有一个电影名称列和3个其他列(我们称它们为a、B和C),它们是来自3个不同来源的评级。 有很多电影只有一个评级,一些电影是三个论坛的组合,还有一些没有评级。我想创建一个新列,该列将:

  • 如果列具有关联的额定值,请使用A
  • 如果列为空,则从B获取相关的评级
  • 如果B列为空,则从C获取相关评级
  • 如果C列为空,则返回“未分级”
  • 这是我目前代码中的内容:

    def check_rating(rating):
        if newyear['Yahoo Rating'] != "\\N":
            return rating
        else:
            if newyear['Movie Mom Rating'] != "\\N":
                return rating
            else:
                if newyear['Critc Rating'] != "\\N":
                    return rating
                else:
                    return "Unrated"
    
    df['Rating'] = df.apply(check_rating, axis=1)
    
    我得到的错误是:

    ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', 'occurred at index 0')
    
    要查看我的数据帧,这里是
    newyear.head()


    我不确定此值错误对解决此问题意味着什么,也不确定这是否是正确的方法。

    您正在原始函数中返回
    评级。。但是
    评级
    ,而不是任何列的值

    >>> df
        A   B   C Genre Title Year
    0   7   6  \N    g1    m1   y1
    1  \N   5   7    g2    m2   y2
    2  \N  \N  \N    g3    m3   y3
    3  \N   4   1    g4    m4   y4
    4  \N  \N   3    g5    m5   y5
    
    >>> def rating(row):
        if row['A'] != r'\N':
            return row['A']
        if row['B'] != r'\N':
            return row['B']
        if row['C'] != r'\N':
            return row['C']
        return 'Unrated'
    
    >>> df['Rating'] = df.apply(rating, axis = 1)
    >>> df
        A   B   C Genre Title Year   Rating
    0   7   6  \N    g1    m1   y1        7
    1  \N   5   7    g2    m2   y2        5
    2  \N  \N  \N    g3    m3   y3  Unrated
    3  \N   4   1    g4    m4   y4        4
    4  \N  \N   3    g5    m5   y5        3
    

    您将在原始函数中返回
    评级
    。。但是
    评级
    ,而不是任何列的值

    >>> df
        A   B   C Genre Title Year
    0   7   6  \N    g1    m1   y1
    1  \N   5   7    g2    m2   y2
    2  \N  \N  \N    g3    m3   y3
    3  \N   4   1    g4    m4   y4
    4  \N  \N   3    g5    m5   y5
    
    >>> def rating(row):
        if row['A'] != r'\N':
            return row['A']
        if row['B'] != r'\N':
            return row['B']
        if row['C'] != r'\N':
            return row['C']
        return 'Unrated'
    
    >>> df['Rating'] = df.apply(rating, axis = 1)
    >>> df
        A   B   C Genre Title Year   Rating
    0   7   6  \N    g1    m1   y1        7
    1  \N   5   7    g2    m2   y2        5
    2  \N  \N  \N    g3    m3   y3  Unrated
    3  \N   4   1    g4    m4   y4        4
    4  \N  \N   3    g5    m5   y5        3
    

    我会这样做:

    df = df.replace('\\N', np.nan)  # this requires import numpy as np
    (df['Yahoo Rating'].fillna(df['Movie Mom Rating']
                       .fillna(df['Critic Rating']
                       .fillna("Unrated"))))
    
    你的代码不起作用的原因是
    newyear['Yahoo Rating']!=“\\N”
    是一个布尔数组。你在这里说的是类似于
    如果[True,False,True,False]:
    。这就是模棱两可的根源。你如何评估这种情况?如果所有这些都是真的,你会执行吗?还是只执行其中一个就足够了


    作为,您可以更改它,以便逐行计算它(因此返回单个值)。但是,逐行应用操作通常很慢,pandas有很好的工具来处理丢失的数据。这就是为什么我建议这样做。

    我会这样做:

    df = df.replace('\\N', np.nan)  # this requires import numpy as np
    (df['Yahoo Rating'].fillna(df['Movie Mom Rating']
                       .fillna(df['Critic Rating']
                       .fillna("Unrated"))))
    
    你的代码不起作用的原因是
    newyear['Yahoo Rating']!=“\\N”
    是一个布尔数组。你在这里说的是类似于
    如果[True,False,True,False]:
    。这就是模棱两可的根源。你如何评估这种情况?如果所有这些都是真的,你会执行吗?还是只执行其中一个就足够了


    作为,您可以更改它,以便逐行计算它(因此返回单个值)。但是,逐行应用操作通常很慢,pandas有很好的工具来处理丢失的数据。这就是我提出这一建议的原因。

    请发布您的数据帧的小样本(作为文本,而不是图像)和预期输出。请发布您的数据帧的小样本(作为文本,而不是图像)和预期输出。非常感谢!我不知道如何使用一个python函数从一列到另一列,所以这非常有用。非常感谢!我不知道如何使用一个python函数从一列行转到另一列行,所以这非常有用。哇,这非常有用!谢谢你的解释。哇,这很有用!谢谢你的解释。