簡體   English   中英

基於另一列的str。包含返回空字符串的值

[英]str.contains based on another column is returning values for empty strings

我需要基於col2中的字符串填充數據幀中的col1,例如:

Out[]: 
   Col2      Col1 
0  SAP       SAP     
1  Oracle    Oracle     
2            N/A     
3  SAP       SAP     
4  SF        Salesforce     

該代碼可以工作,但是col1的值不屬於該值,因為col2為空。 (請參閱第3行)

Out[]: 
   Col2      Col1 
0  SAP       SAP     
1  Oracle    Oracle     
2            Oracle    
3  SAP       SAP     
4  SF        Salesforce     

嘗試添加一個pd.np.where(df[column2]str.contains(""), "Empty")

但是,然后column1的所有字段都用“ Empty”填充,而忽略其余的字段。

這是我的代碼:

DF['Col1']= pd.np.where(DF['Col2'].str.contains('Oracle'), 'Oracle',
            pd.np.where(DF['Col2'].str.contains('SAP'), 'SAP',        
            pd.np.where(DF['Col2'].str.contains('SF'), 'Salesforce', 'N/A')))

預期輸出為:

Out[]: 
   Col2      Col1 
0  SAP       SAP      
1  Oracle    Oracle     
2            N/A    
3  SAP       SAP      
4  SF        Salesforce     

現在獲得了您顯示的數據框,我有了以自己的方式進行操作的不錯的主意,不過可能會有更好的添加。

如注釋部分所示,原始DataFrame:

>>> df
              Catagory     MGA
0           Oracle IPS  Oracle
1  SAP IPS FICA Module  Oracle
2                       Oracle
3   SAAP IPS MM Module  Oracle
4         SF Lightning  Oracle

所以,你可以使用str.split()方法的Catagory由空間分隔符,這將進一步創建4分新列既然你正在尋找從起點值,分裂他們列Catagory欄將落入列0這您必須選擇。

>>> df['Catagory'].str.split(' ', expand=True)
        0          1     2       3
0  Oracle        IPS  None    None
1     SAP        IPS  FICA  Module
2               None  None    None
3    SAAP        IPS    MM  Module
4      SF  Lightning  None    None

正如您在上方的第0列中看到的那樣,我們仍然將使用replace()方法保留一個空單元格,但是,您正在將另一個值SF轉換為Salesforce因此也需要替換,因此,我將使用帶有replace的dict方法來實現一口氣。

解:

vals = {'':'Non-MGA', 'SF':'Salesforce'}

>>> df = df.assign(MGA_NEW=df['Catagory'].str.split(' ', expand=True)[0].replace(vals)).drop(columns={'MGA'})
>>> df
              Catagory     MGA_NEW
0           Oracle IPS      Oracle
1  SAP IPS FICA Module         SAP
2                          Non-MGA
3   SAAP IPS MM Module        SAAP
4         SF Lightning  Salesforce

由於我們不需要從split()生成的其他列,因此我刪除了它們,並使用assign()方法將值分配回新的列MGA_NEW並最終刪除了不需要的原始列MGA

如果要再次保留列名MGA ,則可以這樣做。

>>> df.rename(columns={'MGA_NEW':'MGA'}, inplace=True)
>>> df
              Catagory         MGA
0           Oracle IPS      Oracle
1  SAP IPS FICA Module         SAP
2                          Non-MGA
3   SAAP IPS MM Module        SAAP
4         SF Lightning  Salesforce

希望這會有所幫助!

您可以考慮使用regex而不是使用str.contains("") 以下代碼使用正則表達式將整個數據框中的所有空字符串替換為單詞“ Empty ”:

df.replace(r'^\s*$', 'Empty', regex=True, inplace=True)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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