pandas中对df的筛选

时间:2021-01-04 02:59:14

   

可以通过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['告警标题']))]