2016-07-07 112 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

既可以作为新列,也可以作为构建新数据框的“过滤器”。如果它是一个新的列,我会用它来过滤新的数据框。 –