我确定可能有一个简单的解决方案,但我对Python还是很陌生。
我有一个Pandas DataFrame
,其中包含字符串和NaN值。在此数据框中,我想搜索字符串的特殊部分。这应该逐行完成,找到的字符串将被写入与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"
也许还有更简单的方法? 谢谢!
答案 0 :(得分:0)
出于测试目的,我将源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]])
如您所见,有两个元素包含 hello 和 2个 NaN 元素。 列名在这里不是必需的,因此我没有定义它们。
第一步是将此DataFrame转换为 Series , 过滤出 NaN 值:
ser = pd.Series(data=df.values.flatten()).dropna()
df.values
获取基础的 Numpy 数组,flatten
对其进行整形
到一维数组,然后dropna
删除 NaN 值。
然后,要获取该系列元素的内部带有hello
(不区分大小写),
运行:
ser[ser.str.contains('hello', case=False)].tolist()
对于我们的测试数据,结果为:
['Hello John', 'Xyz hello abc']
我认为,这正是您在评论中所描述的。
对于实际输入数据(比我的示例更长),如果要限制
搜索到仅100个初始行,将df.values
更改为
df.head(100).values
。