在 for 循环中创建多个列 python

creating multiple columns in a for loop python

我是 Python 的新手。 我正在尝试在 for 循环中创建多个列,但我遇到了麻烦。 我有几个列,我正在尝试创建一个新列来显示 ohlcs 中的元素是否大于 metrics 中的元素。我可以这样做来创建一列,但我想节省时间,因为我计划对不同的变量执行相同的功能。

ohlcs = ['open', 'high', 'low', 'close']
metrics = ['vwap', '9EMA', '20EMA']
wip = []
for idx, row in master_df.iterrows():
    for ohlc in ohlcs:
        for metric in metrics:
            row[f'{ohlc} above {metric}'] = np.where(row[ohlc] >= row[metric], 1, 0)

这没有做任何事情。 我也这样做过:

ohlcs = ['open', 'high', 'low', 'close']
metrics = ['vwap', '9EMA', '20EMA']
wip = []
for idx, row in master_df.iterrows():
    for ohlc in ohlcs:
        for metric in metrics:
           if master_df[ohlc] >= master_df[metric]: 
               master_df[f'{ohlc} above {metric}'] = 1
           else:
               master_df[f'{ohlc} above {metric}'] = 0

这给了我一个错误。

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

我做了其他事情,但我在处理它时删除了它们。在这一点上我没主意了。请帮忙!

我现在明白了,但我手动检查了值是否一致,但事实并非如此。

enter image description here

我该如何解决?

无需遍历数据帧的行。这将为您提供所需的结果:

for ohlc in ohlcs:
    for metric in metrics:
        master_df[f'{ohlc} over {metric}'] = (master_df[ohlc] >= master_df[metric]).astype(int)

部分astype(int)只是将TrueFalse转换为10,如果你对True没问题的话和 False 表示,您可以只使用 master_df[f'{ohlc} over {metric}'] = master_df[ohlc] >= master_df[metric].

编辑:当然,(master_df[ohlc] >= master_df[metric]).astype(int) 等同于 np.where(master_df[ohlc] >= master_df[metric], 1, 0),您可以使用任何一个。

考虑 itertools.product 和函数形式 DataFrame.ge 对于所有成对的可能性 fir 更平坦的循环:

from itertools import product
...

ohlcs = ['open', 'high', 'low', 'close']
metrics = ['vwap', '9EMA', '20EMA']

pairs = product(ohlcs, metrics)

for ohlc, metric in pairs:
    master_df[f"{ohlc} over {metric}"] = master_df[ohlc].ge(master_df[metric])