#python #pandas
#python #pandas
Вопрос:
Я хочу отбрасывать строки при многих условиях. Ниже приведен код, но это занимает много времени.
a=[]
for i in range(len(df)):
if df['col_1'][i] in ['a','b'] and (pd.isna(df['col_2'][i])==True or df['col_2'][i]=='c'):
a.append(i)
df.drop(a, inplace=True)
df.reset_index(inplace=True,drop=True)
Ответ №1:
Используйте boolean indexing
с invert
условиями — здесь isin
для ~
, |
для amp;
, amp;
для |
, isna
для notna
и ==
для !=
:
df = pd.DataFrame({
'col_1':list('abgaeb'),
'col_2':[np.nan,'c','d','c','f',np.nan],
})
m = (~df['col_1'].isin(['a','b'])) | df['col_2'].notna() amp; (df['col_2'] !='c')
df = df[m]
print (df)
col_1 col_2
2 g d
4 e f
Ответ №2:
Попробуйте это:
df = df.loc[~(df['col_1'].isin(['a','b']) amp; ((pd.isna(df['col_2'])==True) | (df['col_2']=='c')))]