【问题标题】:Create new column in pandas dataframe based on if/elif/and functions基于 if/elif/and 函数在 pandas 数据框中创建新列
【发布时间】:2017-11-14 15:04:00
【问题描述】:

我已经搜索了我的确切问题,但无济于事。这两个线程Creating a new column based on if-elif-else conditioncreate new pandas dataframe column based on if-else condition with a lookup 引导我的代码,尽管我的代码无法执行。

问题:我有一个数据框,我在下面复制了示例。区域属性只有两个值 - a 或 b(或可能有更多),年份相同,但区域 a 可能有两个年份等。我想要做的是创建一个新列“美元”,并查找值对于地区,如果是地区“a”并且年份是例如 2006 年,则在该行中获取销售额,然后乘以 该年的汇率,并在新列中附加值 - 美元。我是初学者,下面是我到目前为止所拥有的 - 通过函数 - 显然执行 .apply 函数会返回一个 ValueError: ('一个系列的真值是不明确的。使用 a.empty, a .bool()、a.item()、a.any() 或 a.all().', '发生在索引 0')。我对更高效的实现特别感兴趣,因为数据框相当大,并且希望优化计算效率。

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

【问题讨论】:

    标签: python-3.x sklearn-pandas


    【解决方案1】:

    此问题可能与您使用它的方式有关。不知道对你有没有帮助。但我已经根据我的知识重新编写了代码。

    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)
    

    【讨论】:

    • 您的实现适用于示例数据集并提供了我想要的。我仍然在我的大量数据上运行它,并且不确定它何时会完成:-)。就像我提到的那样,我知道可能有比我的方法更有效的方法,所以会继续寻找。
    • 肯定还有其他有效的方法可用。但是你至少可以开始使用这段代码,当你找到更好的方法时可以替换这部分。
    猜你喜欢
    • 2021-11-28
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 2014-03-09
    相关资源
    最近更新 更多