基于部分startswith匹配合并两个数据帧

Posted

技术标签:

【中文标题】基于部分startswith匹配合并两个数据帧【英文标题】:Merge two dataframes based on partial startswith match 【发布时间】:2020-10-15 01:10:48 【问题描述】:

我有两个数据框,我想根据 start 的部分匹配来合并(在下面的示例中以 df1.A 开头的 df2.B 中的行,这些列的值是字符串,可以是任何长度)。

我可以通过以下方式做到这一点,但在我的实际数据帧上非常慢,每个数据帧都有数百万行。

df1 = pd.DataFrame('A': ['a', 'b', 'cc'])

df2 = pd.DataFrame('B': ['ar', 'd', 'ar'],
                    'C': ['x1', 'x1', 'x2'])

df_m = pd.DataFrame(columns=['A','B','C'])
for index, row in df1.iterrows():
    df_ = df2[df2['B'].str.startswith(row['A'])]
    if not df_.empty:
        df_['A'] = row['A']
        df_m = df_m.append(df_)

df_m:

    A   B   C
0   a   ar  x1
2   a   ar  x2

【问题讨论】:

【参考方案1】:

我们可以用regexfindall

reg='^('+'|'.join(df1.A.tolist())+')'
df2['A']=df2.B.str.findall(reg).str[0]
df2
Out[60]: 
    B   C  A
0  ar  x1  a
1  ba  x1  b
2  ar  x2  a

【讨论】:

"ba" 不是df2.B 的值之一。我认为我的问题需要更清楚。在帖子中添加了更多详细信息。 @Reveille 我正在使用 ba 进行测试【参考方案2】:

使用Series.str.extractdf2 的B 列中提取key,该列以df1 的A 列开头,然后使用DataFrame.mergedf1 上的数据框df1 合并到column A 和@ 987654330@列key

key = df2['B'].str.extract('^(' + '|'.join(df1['A']) + ')')
df3 = df1.merge(df2.assign(key=key), left_on='A', right_on='key').drop('key', 1)

结果:

df3
   A   B   C
0  a  ar  x1
1  a  ar  x2

【讨论】:

在我的数据子集上运行它,并将运行时间从 60 秒减少到 5 秒,并且优于其他解决方案。谢谢。【参考方案3】:

如果你想使用df.merge,你可以这样做:

df2[['l1','l2']] = pd.DataFrame(df2.B.apply(list).tolist(),index= df2.index)     
df_m = df1.merge(df2, left_on='A', right_on='l1').drop(['l1', 'l2'], 1)

输出:

In [70]: df_m 
Out[70]: 
   A   B   C
0  a  ar  x1
1  a  ar  x2

【讨论】:

谢谢,但是当我在第一行运行它时出现此错误:ValueError: Columns must be same length as key。我的 pd.__version__ 1.0.5

以上是关于基于部分startswith匹配合并两个数据帧的主要内容,如果未能解决你的问题,请参考以下文章

如果匹配,如何合并两个数据帧并从新列中的另一列返回数据?

基于不规则时间列合并两个数据帧

是否有一个 R 函数来匹配基于具有部分相似性的字符串的数据框列?

Pandas 基于时间窗口合并两个时间序列数据帧(cut/bin/merge)

使用 pd.merge() 合并两个以上的数据帧

R中merge