我有两个数据框,我想根据以下内容的开头匹配来合并(在下面的示例中,以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
答案 0 :(得分:3)
使用Series.str.extract
从key
的B列(从df2
的A列开始提取df1
,然后使用DataFrame.merge
合并df1
上的datframe column A
和列df2
上的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
答案 1 :(得分:2)
我们可以用findall
做regex
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
答案 2 :(得分:2)
如果要使用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