为什么“if”语句不从 python 中的数据框中选择条件的特定行

rol*_*ter 5 python

编写一个函数,该函数应满足行基础上的条件并返回预期结果

def bt_quantity(df):
    df = bt_level(df)
    df['Marker_change'] = df['Marker'] - df['Marker'].shift(1).fillna(0).round(0).astype(int)
    df['Action'] = np.where(df['Marker_change'] > 0, "BUY", "")

    def turtle_split(row):
        if df['Action'] == 'Buy':
            return baseQ * (turtle ** row['Marker'] - 1) // (turtle - 1)
        else:
            return 0
    df['Traded_q'] = df.apply(turtle_split, axis=1).round(0).astype(int)
    df['Net_q'] = df['Traded_q'].cumsum().round(0).astype(int)
    print(df.head(39))
    return df
Run Code Online (Sandbox Code Playgroud)

这是一个常见问题,我没有在代码中使用任何“和”或“或”。仍然收到以下错误

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

我尝试将 str 更改为 int(BUY >> 1),但没有进展。PS 数据集很大,我正在使用多个模块和函数来处理这个项目。

Sud*_*osh 5

正如您所说,这确实是一个常见问题,您会发现系列真值的答案 是模棱两可的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()

但为了解决您的特定情况,这并不是一种非常有效的方法,因为数据集很大。你应该使用 Numpy。这将大大缩短运行时间。

我发现您的代码片段有两个问题

  1. 有一个错字。您使用了“购买”,然后使用了“购买”。Python 区分大小写。
  2. col Action 正在接受完全“买入”的测试。修复方法是使用 row (不是 pythonic 方式,而是一个小修复)
def bt_quantity(df):
    df = bt_level(df)
    df['Marker_change'] = df['Marker'] - df['Marker'].shift(1).fillna(0).round(0).astype(int)
    df['Action'] = np.where(df['Marker_change'] > 0, "BUY", "")

    def turtle_split(row):
        if row['Action'] == 'BUY':
            return baseQ * (turtle ** row['Marker'] - 1) // (turtle - 1)
        else:
            return 0
    df['Traded_q'] = df.apply(turtle_split, axis=1).round(0).astype(int)
    df['Net_q'] = df['Traded_q'].cumsum().round(0).astype(int)
    print(df.head(39))
    return df
Run Code Online (Sandbox Code Playgroud)