簡體   English   中英

使用正則表達式按行過濾熊貓數據框

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM