ДОБАВЛЕННЫЙ ОТВЕТ НА ВАШ 2-Й ВОПРОС
Чтобы достичь того, что вы хотите сделать, просто сравните столбцы напрямую:
import pandas as pd
import numpy as np
df = pd.DataFrame({'a':[1,3,5,7,9],
'b':[0,0,0,0,0],
'c':[1,3,5,7,9],
'd':[0,np.nan,np.nan,0,np.nan]})
# Fill the nan and empty cells with 0
df = df.fillna(0)
# To do the comparison you desire
df['aVsc'] = (df['a'] == df['c'])
df['bVsc'] = (df['b'] == df['d'])
Причина, по которой вы получаете ошибка в том, что df['b'] == df['d']
возвращает вам серию:
0
0 True
1 True
2 True
3 True
4 True
, и, следовательно, невозможно оценить логическое значение ряда, если вы не укажете any
или all
, что не будет делать то, что вы хотите в любом случае.
И, наконец, в отдельном примечании, это был неправильный способ сделать список понятным. У него должен быть итератор, и вам нужно l oop поверх итератора. Примерно так: [True if i == 'something' else False for i in iterator]
.
2-й вопрос
Если вы хотите, чтобы df['aVsc]
было 0, когда df['a'] == df['c']
, и df['aVsc] == df['a']
в противном случае, вы можете используйте np.where
:
df['aVsc'] = np.where(df['a'] == df['c'], 0, df['a'])
, в котором функция np.where
означает проверку, если условие df['a'] == df['c']
равно True
, если это так, присвойте значение 0
, назначьте значение df['a']
.