[英]Filter pandas dataframe by row with regex
我敢肯定可能有一个简单的解决方案,但我对Python还是很陌生。 我有一个带有字符串和NaN值的Pandas DataFrame
。 在此数据框中,我想搜索字符串的特殊部分。 这应该逐行完成,找到的字符串将被写入与Dataframe具有相同行数的列表中(这意味着如果我要查找的部分字符串在该行中无法匹配,则列表中的条目应为'没有')。
我试过: result.loc[result[0].str.contains("hello", na=False)]
但这只给我返回第一列包含hello字样的行。
我正在考虑在每行中使用正则表达式进行for循环搜索:
row = df.iloc[0:100]
for item in row:
row_dict={}
hello = re.search(r"hello.*", item)
if hello is None:
hello = "NaN"
也许还有一种更简单的方法? 谢谢!
出于测试目的,我将源DataFrame定义为:
df = pd.DataFrame(data=[
['Halo Mike', 'How are you?', np.nan],
['Hello John', 'Good morning', 'What a nice day'],
['Ello Jack', 'Xyz hello abc', np.nan]])
如您所见,有2个元素包含hello和2个NaN元素。 列名在这里不是必需的,因此我没有定义它们。
第一步是将此DataFrame转换为Series ,并过滤掉NaN值:
ser = pd.Series(data=df.values.flatten()).dropna()
df.values
获取基础的Numpy数组, flatten
将其dropna
为一维数组, dropna
删除NaN值。
然后,要获取内部带有hello
的本系列元素(不区分大小写),请运行:
ser[ser.str.contains('hello', case=False)].tolist()
对于我们的测试数据,结果为:
['Hello John', 'Xyz hello abc']
我认为,这正是您在评论中所描述的。
对于实际输入数据(比我的示例更长),如果要将搜索限制为仅100个初始行, df.values
df.head(100).values
更改为df.head(100).values
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.