可以通过bool序列(包括list,series),对df进行筛选
a b c
0 1 4 7
1 2 5 8
2 3 6 9
3 7 7 hi
例如对df的筛选条件是,df列的值=1,可以:
bool_series = df['a']==1
bool_list = list(map(lambda i : i==1, df['a']))
但如果想打印第二第三行,bool_series可以直接取~,bool_list只能先转series再取反
df[~bool_series]
df[~(bool_list)]
列项条件多时,可以用bool_list轮询筛选,例如筛选每行都不含7的:
bool_list = [True] * len(df)
for column in df.columns:
bool_list = bool_list * (df[column] !)= 7 # list和series可以直接做*或者&操作
df[bool_list]
当然也可以直接逐个写df筛选,但columns比较多的话就比较麻烦了:
df[(df['a']!=7)&(df['b']!=7)&(df['c']!=7)]
如果想筛选a列中,等于2或者3的,可以用isin
df[df['a'].isin([2,3])]
前面是df中的成员在某列表中,如果想反过来筛选某个值是否在df的成员中,例如筛选c列中元素中,包含了字母i的,可以:
df[pd.Series(map(lambda x: 'i' in x, df['c']))] # pd.series也可以改为list
比较复杂的语句:取出gaojing这个df中,告警标题中含有 ponlos,主干光纤断,pon信号丢失这3条告警的条目(不区分大小写)
list_zggj = ['ponlos', '主干光纤断', 'PON信号丢失']
gaojing[pd.Series(map(lambda x:(len(filter(lambda s: s in x.lower(), list_zggj)) > 0), gaojing['告警标题']))]