Я думаю, что проблема заключается в тестировании Series
(столбец данных) с несколькими значениями одновременно, как в (all_data['Freq'] == [60, 132])
Создайте простую серию:
In [190]: s = pd.Series(['a','b','c','b','d'])
In [191]: s
Out[191]:
0 a
1 b
2 c
3 b
4 d
dtype: object
test это против одного значения:
In [192]: s=='a'
Out[192]:
0 True
1 False
2 False
3 False
4 False
dtype: bool
Это хорошая логическая серия, которая может быть объединена с другим тестом. Вы используете &
для объединения тестов в разных столбцах, но из примера «неуклюжий» я понимаю, что вам нужна комбинация |
или «для одного столбца:
In [193]: (s=='a')|(s=='b')
Out[193]:
0 True
1 True
2 False
3 True
4 False
dtype: bool
У вас проблемы при попытке сделать это 'или' проверить таким образом:
In [194]: s==['a','b']
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-194-a889b3de7e64> in <module>
----> 1 s==['a','b']
/usr/local/lib/python3.6/dist-packages/pandas/core/ops/__init__.py in wrapper(self, other, axis)
1205 # as it will broadcast
1206 if other.ndim != 0 and len(self) != len(other):
-> 1207 raise ValueError("Lengths must match to compare")
1208
1209 res_values = na_op(self.values, np.asarray(other))
ValueError: Lengths must match to compare
5 значений s
не соответствуют 2 на RHS.
Если вы выполните тест строка за строкой запускается, хотя в результате есть «и» logi c, а не «или». Строка должна соответствовать обеим строкам, чего она не может:
In [195]: for row in s:
...: print(row==['a','b'])
...:
False
False
False
False
False
numpy
и pandas
реализуют broadcasting
, что позволяет нам выполнять более сложные тесты. Используя values
, массив numpy, полученный из Series, который я могу сделать:
In [197]: s.values[:,None]==['a','b']
Out[197]:
array([[ True, False],
[False, True],
[False, False],
[False, True],
[False, False]])
In [198]: _.any(axis=1)
Out[198]: array([ True, True, False, True, False])
такая же последовательность True / False, как в Out[193]
Альтернатива копии и вставить будет параметризованное сравнение:
for a,b,c in [(60,'2019...','2'),(52,'2020...','3')]:
all_data['Zone'] = np.where((all_data['Freq'] == a) &
(all_data['YMD'] == b) &
(all_data['observation'] == c), 'u',
all_data['Zone'])