Можно маскировать с помощью логического кадра данных, затем использовать dropna
:
df = pd.DataFrame({'A': [1, '-', '-', 4, '-'],
'B': ['A', 'B', '-', 'C', '-'],
'C': [0.5, '-', '-', 1.5, 2.5]})
df = df.mask(df == '-').dropna()
print(df)
A B C
0 1 A 0.5
3 4 C 1.5
По умолчанию dropna
удаляет строки (axis=0
), где любое значение равно нулю (how='any'
).Вы можете изменить эти параметры соответствующим образом.
Примечание: Функционально идентично df = df[df != '-'].dropna()
.Хотя, с косметической точки зрения, намерение из mask
может показаться более ясным.
Проблема с вашим решением - df_c.notnull()
дает логическое значение dataframe массив, но вы хотите индексировать через одномерный массив / серию.Вы могли бы использовать:
df_c = df[df != '-']
df_c = df_c[df_c.notnull().all(1)]
Но это многословно и, вероятно, неэффективно.