请原谅我的头衔;我很难总结一个复杂的问题。
我的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('')
答案 0 :(得分:2)
您可以将contains
与s=~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
,所以我概述了一个包含stack
,str.split
和np.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