2016-07-07 110 views
1

我在Python Pandas中有兩個DataFrame。熊貓數據幀 - 基於「InStr」合併兩個數據幀> 0

存儲在單元中的數據如下:

DF1 
- DatabaseId Integer 
- DatabaseName String 

DF2 
- CreateString String 

我想列DataBaseID適用於DF2任何記錄,其中DF1.DatabaseName創建的字符串的上下文中存在。

Example: 
DatabaseName = "UserDB"  CreateString = "This create string would fail" 
DatabaseName = "UserDB"  CreateString = "This create string has UserDB in it" 

第一條記錄會失敗並且不包含在結果集中。 第二條記錄會成功,並將在結果集中。

我已經研究了各種選項,包括.isin.contains,但這些都沒有奏效。這似乎是一個'受控'的笛卡爾連接,'if match found success'條件。但我一直無法找到一種方法來做到這一點,而且它是有效的。

需要評估的總列表大小在每個100K到500K之間。

UPDATE 增加了更多的示例數據:

>>> DF1.head(10) 
DatabaseID  DatabaseName 
0    DB1 
1    DB2 
2    DB3 
3    DB4 
... 

>>> DF2.head(10) 
CreateString 
None 
None 
None 
CREATE VIEW DB1.Table1 AS LOC… 
None 
REPLACE VIEW DB3.Table3... 
CREATE VIEW DB3.Table10 AS SELE... 
CREATE VIEW DB55.Table999 AS SELEC... 
... 

Desired Result 
DatabaseID  DatabaseName  CreateText 
0    DB1     CREATE VIEW DB1.Table1 AS LOC… 
2    DB3     REPLACE VIEW DB3.Table3... 
2    DB3     CREATE VIEW DB3.Table10 AS SELE... 
... 
etc... 
... 
+6

你可以顯示你的* actual * DataFrames嗎? – chrisaycock

+0

爲了澄清,您只需要DF2中包含DF1的DatabaseName列中的某個數據庫名稱的條目?你有沒有嘗試從DatabaseName列中創建一個正則表達式,然後做類似DF2.loc [:,'CreateString']。str.contains(regex),其中regex是從DF1 DatabaseName列創建的正則表達式? –

回答

1

UPDATE:如何解析表名:

In [100]: df2['TableName'] = df2.CreateString.str.extract('\s+(\w+\.\w+)\s+', expand=True) 

In [101]: df2 
Out[101]: 
          CreateString DatabaseName  TableName 
0         None   NaN   NaN 
1         None   NaN   NaN 
2         None   NaN   NaN 
3   CREATE VIEW DB1.Table1 AS LOC…   DB1  DB1.Table1 
4         None   NaN   NaN 
5   REPLACE VIEW DB3.Table3 ...   DB3  DB3.Table3 
6  CREATE VIEW DB3.Table10 AS SELE...   DB3 DB3.Table10 
7 CREATE VIEW DB55.Table999 AS SELEC...   DB55 DB55.Table999 

原來的答覆:

你可以這樣做:

In [83]: df2['DatabaseName'] = df2.CreateString.str.extract('\s+(\w+)\.\w+\s+', expand=True) 

In [84]: pd.merge(df2, df1, on='DatabaseName', how='left') 
Out[84]: 
          CreateString DatabaseName DatabaseID 
0         None   NaN   NaN 
1         None   NaN   NaN 
2         None   NaN   NaN 
3   CREATE VIEW DB1.Table1 AS LOC…   DB1   0.0 
4         None   NaN   NaN 
5   REPLACE VIEW DB3.Table3 ...   DB3   2.0 
6  CREATE VIEW DB3.Table10 AS SELE...   DB3   2.0 
7 CREATE VIEW DB55.Table999 AS SELEC...   DB55   NaN 
+0

雖然這適用於數據庫,但如果我需要Database ||'。'|| Tablename呢?無論如何做一個「INSTR」(instring)類型檢查? Oracle示例位於以下位置:https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_functions_1103.htm –

+0

@Lee_Str,您需要在哪裏?作爲一個新的專欄? – MaxU

+0

既可以作爲新列,也可以作爲構建新數據框的「過濾器」。如果它是一個新的列,我會用它來過濾新的數據框。 –