代码之家  ›  专栏  ›  技术社区  ›  wrangler

基于if/elif/and函数在pandas数据帧中创建新列

  •  0
  • wrangler  · 技术社区  · 7 年前

    我已经搜索了我的确切问题,但没有结果。这两条线 Creating a new column based on if-elif-else condition create new pandas dataframe column based on if-else condition with a lookup 指导我的代码,尽管我的代码无法执行。

    问题:我有一个数据帧,下面有一个复制的例子。Region属性只有两个值-a或b(或可能有更多),与年份相同,但Region a可能有两个年份等。我要做的是创建一个新列“dollars”,并查找Region的值,如果是Region“a”,年份是例如2006,则取该行中的销售额,并与相乘 当年费率 并在新列中附加值-美元。我是初学者,下面是我到目前为止所拥有的-通过函数-显然是执行。应用函数返回一个 值错误:

    import pandas as np
    
    rate_2006, rate_2007 = 100, 200
    
    
    c = {
    'region': ["a", "a", "a", "a", "a", "b", "b", "b", "b", "a", "b"],
    'year': [2006, 2007, 2007, 2006, 2006, 2006, 2007, 2007, 2007, 2006, 2007],
    'sales': [500, 100, 2990, 15, 5000, 2000, 150, 300, 250, 1005, 600]
    }
    
    df1 = pd.DataFrame(c)
    df1
    
    def new_col(row): 
        if df1["region"] == "a" and df1["year"] == 2006:
            nc = row["sales"] * rate_2006
        elif df1["region"] == "a" and df1["year"] == 2007:
            nc = row["sales"] * rate_2007
        elif df1["region"] == "b" and df1["year"] == 2006:
            nc = row["sales"] * rate_2006
        else:
            nc = row["sales"] * rate_2007
        return nc
    
    df1["Dollars"] = df1.apply(new_col, axis=1)
    df1
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Sumit S Chawla    7 年前

    这个问题可能是因为你使用它的方式。我不知道这是否对你有帮助。但我已经根据我的知识重新编写了代码,这是可行的。

    import pandas as pd
    
    rate_2006, rate_2007 = 100, 200
    
    
    c = {
    'region': ["a", "a", "a", "a", "a", "b", "b", "b", "b", "a", "b"],
    'year': [2006, 2007, 2007, 2006, 2006, 2006, 2007, 2007, 2007, 2006, 2007],
    'sales': [500, 100, 2990, 15, 5000, 2000, 150, 300, 250, 1005, 600]
    }
    
    df1 = pd.DataFrame(c)
    print(df1)
    
    def new_col(value): 
        if df1.loc[value,"region"] == "a" and df1.loc[value,"year"] == 2006:
            df1.loc[value,"Dollars"] = df1.loc[value,"sales"] * rate_2006
        elif df1.loc[value,"region"] == "a" and df1.loc[value,"year"] == 2007:
            df1.loc[value,"Dollars"] = df1.loc[value,"sales"] * rate_2007
        elif df1.loc[value,"region"] == "b" and df1.loc[value,"year"] == 2006:
            df1.loc[value,"Dollars"] = df1.loc[value,"sales"] * rate_2006
        else:
            df1.loc[value,"Dollars"] = df1.loc[value,"sales"] * rate_2007
    
    for value in range(len(df1)):
        new_col(value)