【问题标题】:pandas numpy complex ifpandas numpy 复杂的 if
【发布时间】:2018-03-18 06:29:28
【问题描述】:

我需要在具有以下条件的熊猫数据框中添加一列: 如果销售量(存储在数据集['sum'])在 4 和 16 之间,预测应该是 1,否则舍入到整数平均销售量(存储在数据集 ['average'])。这里是代码:

def more_than3_filter(dataset, filename):    
    prediction = []

    for row in dataset['part number']:
        if dataset['sum'] > 3:
            if dataset['sum'] < 16:
                prediction.append(1)
        else:
            prediction.append(round(dataset['average']))

我明白了

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

与 np.where 相同 我应该怎么办? 谢谢

【问题讨论】:

  • dataset['sum'] &gt; 3 是一个布尔值数组。你希望他们都是真的吗?或者只是其中任何一个?

标签: python pandas numpy


【解决方案1】:

您的循环已关闭。您应该迭代df.iterrows,并且您的if 条件应该引用row,而不是dataset

除此之外,您根本不需要循环。您可以使用 pd.Series.between + np.where 对所有内容进行矢量化以获得额外性能。

df['new'] = np.where(
    df['sum'].between(3, 16, inclusive=False), 1, df['average'].round()
)

另一个解决方案涉及loc -

df['new'] = 1
m = ~df['sum'].between(3, 16, inclusive=False)
df.loc[m, 'new'] = df.loc[m, 'average'].round()

这应该稍微更有效率,因为它涉及的冗余计算更少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多