Pandas:如果最后六个字符包含低于阈值的任何整数,则删除单元格

时间:2018-05-02 00:43:08

标签: python-3.x list pandas dataframe filter

请原谅我的头衔;我很难总结一个复杂的问题。

我的pandas数据框的值如下所示:

    col1         col2            col3          col4       
10_Q999999   111_Q4987666    110_Q277778   111_Q999999

假设阈值为7.我需要获取该数据帧并删除_Q之后任何数字低于阈值7的每个单元格。对于每个数字> = 7的单元格,我只想保留“_Q”之前的字符串部分。

所需的输出如下所示:

  col1            col2            col3          col4       
   10                                           111

我试图找出用“_Q”拆分每一列的方法,将最后一段转换为整数列表,取最小值,然后将最小值与阈值进行比较,最后删除整数列表,但我陷入了令人厌恶的嵌套列表理解的中间:

[[[int(z) for z in y[-3:] if (z != '') and "Q" not in z ] for y in chunk[x].astype(str).str.split("_") if y != ''] for x in chunk[cols] if x != '']

解决方案:

s=~chunk.apply(lambda x : 
x.str.split('_Q').str[1].str.contains('[0:6]', na=False))
        chunk = chunk.apply(lambda x : x.str.split('_Q').str[0])[s].fillna('')

2 个答案:

答案 0 :(得分:2)

您可以将containss=~df.apply(lambda x : x.str.split('_Q').str[1].str.contains('1|2|3|4|5|6')) df.apply(lambda x : x.str.split('_Q').str[0])[s].fillna('') Out[549]: col1 col2 col3 col4 0 10 111

一起使用
session

答案 1 :(得分:1)

我不喜欢apply,所以我概述了一个包含stackstr.splitnp.where的替代方案,以便(希望)提高效果。

v = df.stack()
sp = v.str.split('_Q')
i, j = sp.str[0], sp.str[1]

v[:] = np.where(j.str.contains('[0-6]'), '', i)
v.unstack()

  col1 col2 col3 col4
0   10            111