Мне интересно, почему приведенный ниже условный выбор не работает. Я бы ожидал, что будут выбраны индексы 0 и 3, но это ничего не возвращает. Интересно, не упускаю ли я что-то очевидное.
In [5]: a = {'A':['this', 'is', 'an', 'example'], 'B':[None, None, None, None],
...: 'C':['some', 'more', 'example', 'data']}
In [6]: df = pd.DataFrame(a)
In [7]: df
Out[7]:
A B C
0 this None some
1 is None more
2 an None example
3 example None data
Это возвращает 2 строки:
In [8]: df.loc[(df['A'].str.len() > 3)]
Out[8]:
A B C
0 this None some
3 example None data
И это возвращает все строки:
In [9]: df.loc[(df['B'].isnull())]
Out[9]:
A B C
0 this None some
1 is None more
2 an None example
3 example None data
Поэтому я ожидаю, что это вернет индексы 0 и 3, но не вернет никаких строк.
In [10]: df.loc[(df['B'].isnull() & df['A'].str.len() > 3)]
Out[10]:
Empty DataFrame
Columns: [A, B, C]
Index: []
Любая помощь будет оценена по достоинству.
Спасибо!
Да, в Pandas всегда разумно заключать в скобки каждое условие. (конд1) и (конд2).
Вам нужно использовать отдельные скобки:
df.loc[(df['B'].isnull()) & (df['A'].str.len() > 3)]
A B C
0 this None some
3 example None data
Это связано с Приоритет оператора. В вашем коде df['B'].isnull() & df['A'].str.len()
оценивается первым, что дает:
0 False
1 False
2 False
3 True
dtype: bool
Затем применяется оставшееся сравнение >3
, что дает:
0 False
1 False
2 False
3 False
dtype: bool
И, таким образом, исходная строка не возвращает строк вместо желаемых индексов.
Это опечатка, круглые скобки должны быть вокруг условий, поэтому используйте:
df.loc[(df['B'].isnull()) & (df['A'].str.len() > 3)]
Выход:
A B C
0 this None some
3 example None data
Использование операторов логического сравнения
Series/DataFrame
может помочь сократить количество скобок:df.loc[df['B'].isnull() & df['A'].str.len().gt(3)]