【发布时间】:2020-05-01 16:53:50
【问题描述】:
我希望代码遍历条件中的选项,这样我就不必一遍又一遍地复制和粘贴相同的代码,而只改变条件。
这是我的代码夹:
for row in range(0, len(all_data)):
all_data['Zone'] = np.where((all_data['Freq'] == [60, 132]) &
(all_data['YMD'] == ['2019-11-05 00:00:00', '2019-11-18 00:00:00']) &
(all_data['observation'] == ['2', '2']), ['u', 'u'],
[all_data['Zone'], all_data['Zone']])
但是,我收到以下错误和回溯:
Traceback(最近一次调用最后一次):文件 "C:\ProgramData\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", 第 3319 行,在 run_code 中 exec(code_obj, self.user_global_ns, self.user_ns) 文件“”,第 4 行,在 (all_data['YMD'] == ['2019-11-05 00:00:00', '2019-11-18 00:00:00']) & 文件 "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\ops__init__.py", 第 1179 行,在包装器中 res_values = dispatch_to_index_op(op, self, other, pd.DatetimeIndex) 文件 "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\ops__init__.py", 第 630 行,在 dispatch_to_index_op 中 结果 = op(left_idx, right) 文件 "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexes\datetimelike.py", 第 132 行,在包装器中 结果 = op(self._data, maybe_unwrap_index(other)) 文件“C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\arrays\datetimes.py”, 第 182 行,在包装器中引发 ValueError("Lengths must match") ValueError: 长度必须匹配
看起来错误是“ValueError:长度必须匹配”。我试图通过复制替换值“u”和替换位置“all_data['Zone']”来修复这个错误,但这显然没有解决问题。 我不确定我哪里出错了或者如何解决这个问题。如果有人有使用 np.where 达到相同目标的替代解决方案,我愿意接受该解决方案。
EDIT1- 添加示例数据
Freq YMD Zone observation
60 10/21/2019 A 1
60 10/21/2019 A 2
60 11/5/2019 A 1
60 11/5/2019 A 2
60 11/18/2019 0 1
60 11/18/2019 0 2
132 10/10/2019 A 2
132 10/21/2019 A 1
132 10/21/2019 A 2
132 11/5/2019 A 1
132 11/5/2019 A 2
132 11/18/2019 A 1
132 11/18/2019 A 2
170 8/31/2019 A 1
170 8/31/2019 N 2
170 9/1/2019 N 1
EDIT2- 添加示例预期输出
Freq YMD Zone observation
60 10/21/2019 A 1
60 10/21/2019 A 2
60 11/5/2019 A 1
60 11/5/2019 u 2
60 11/18/2019 0 1
60 11/18/2019 0 2
132 10/10/2019 A 2
132 10/21/2019 A 1
132 10/21/2019 A 2
132 11/5/2019 A 1
132 11/5/2019 A 2
132 11/18/2019 A 1
132 11/18/2019 u 2
170 8/31/2019 A 1
170 8/31/2019 N 2
170 9/1/2019 N 1
Edit3- 符合目标的笨重代码 这段代码可以满足我的需要,但我不想为每个新的“freq”和“YMD”组合一遍又一遍地复制和粘贴代码。我只想在条件中有一个列表来迭代。即,如果我有 6 种不同的“Freq”和“YMD”组合,我将不得不粘贴代码块 6 次并更改条件。如果有足够的条件组合,它可能会使代码变得很长而且看起来很草率。
all_data['Zone'] = np.where((all_data['Freq'] == 60) &
(all_data['YMD'] == '2019-11-05 00:00:00') &
(all_data['observation'] == '2'), 'u',
all_data['Zone'])
all_data['Zone'] = np.where((all_data['Freq'] == 132) &
(all_data['YMD'] == '2019-11-18 00:00:00') &
(all_data['observation'] == '2'), 'u',
all_data['Zone'])
【问题讨论】:
-
1.在
for循环中使用np.where似乎不正确。 2.all_data['Freq'] == [60, 132]不应该工作,除非您的数据只有 2 行。 -
好的,我如何让它遍历所有行以查找选项 1 并替换,然后通过选项 X 和替换选项 2。我目前只显示 2 个选项,但理论上,可能还有更多。
-
当条件只有一个选项并且我需要按顺序更新行和 np.where 时,我使用了 np.where 是 for 循环。具体来说,当条件依赖于前一行时。
-
请从您的示例数据中添加您的预期输出。
-
我添加了预期的输出
标签: python-3.x pandas numpy conditional-statements