Python Pandas数据帧-基于“合并”合并两个数据帧;InStr“&燃气轮机;0

Python Pandas数据帧-基于“合并”合并两个数据帧;InStr“&燃气轮机;0,python,pandas,dataframe,Python,Pandas,Dataframe,我在Python中有两个数据帧 存储在单元格中的数据如下所示: DF1 - DatabaseId Integer - DatabaseName String DF2 - CreateString String 我想将列DataBaseID应用于DF2中的任何记录,其中DF1.DatabaseName存在于Create String的上下文中 Example: DatabaseName = "UserDB" CreateString = "This create str

我在Python中有两个数据帧

存储在单元格中的数据如下所示:

DF1
- DatabaseId    Integer
- DatabaseName  String

DF2
- CreateString  String
我想将列DataBaseID应用于DF2中的任何记录,其中DF1.DatabaseName存在于Create String的上下文中

Example:
DatabaseName = "UserDB"        CreateString = "This create string would fail"
DatabaseName = "UserDB"        CreateString = "This create string has UserDB in it"
第一条记录将失败,并且不会包含在结果集中。 第二条记录将成功,并将出现在结果集中

我研究了各种选项,包括
.isin
,和
.contains
,但这些都不起作用。这似乎是一个“受控”笛卡尔连接,带有“如果匹配成功”条件。但我还没有找到一种方法来做到这一点,而且效率很高

需要评估的总列表大小在100K和500K之间

更新 添加了更多示例数据:

>>> 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...
...

更新:如何解析表名:

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

您可以显示实际的数据帧吗?为了澄清,您只需要DF2中包含DF1的DatabaseName列中的一个数据库名称的条目?您是否尝试过从DatabaseName列生成正则表达式,然后执行类似于DF2.loc[:,'CreateString'].str.contains(regex)的操作,其中regex是从DF1 DatabaseName列生成的正则表达式?虽然这对数据库有效,但如果我需要数据库| |'。| | Tablename怎么办?是否需要进行“安装”(安装)类型检查?这里有一个甲骨文的例子:@Lee_Str,你在哪里需要它?作为新列?作为新列或作为构建新数据帧的“过滤器”。如果它是一个新列,我将使用它来过滤新的数据帧。@Lee_Str,它有帮助吗?谢谢。是的,的确如此!我需要学习正则表达式。