在 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)
只是将True
和False
转换为1
和0
,如果你对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])
我是 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)
只是将True
和False
转换为1
和0
,如果你对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])