簡體   English   中英

基於部分startswith匹配合並兩個數據幀

[英]Merge two dataframes based on partial startswith match

我有兩個 dataframe 我想基於 start with 的部分匹配進行合並(在下面的示例中,df2.B 中以 df1.A 開頭的行,這些列的值是字符串,可以是任何長度)。

我可以通過以下方式做到這一點,但在我的實際數據幀上非常慢,每個數據幀都有數百萬行。

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

使用Series.str.extractdf2中的 B 列中提取鍵,該keydf1中的 A 列開始,然后使用DataFrame.mergecolumn A上的數據幀df1和列key上的df2合並:

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

我們可以用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

如果你想使用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)

Output:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM