在pandas中对齐两列字符串(递归合并字符串直到匹配)

uemypmqf  于 2023-04-10  发布在  其他
关注(0)|答案(1)|浏览(115)

我有以下Pandasdf

import pandas as pd
df = pd.DataFrame(data={'col1': ["Sun", "Sea:", "SARS-COV-2", "Hong-Kong", "Fish", "NaN", "NaN", "NaN", "NaN", "NaN", "NaN", "NaN"],
                        'col2': ["Sun", "Sea", ":", "SARS", "-", "COV", "-", "2", 'Hong', '-', 'Kong', 'Fish'],
                        'col3': ["H", "Q", "S", "X", "Y", "Z", "L", "M", 'A', 'B', 'C', 'O']})
df
col1col2col3
太阳太阳H
海:Q
SARS-COV-2S
香港SARSX
- -Y
NaNCOVZ
NaN- -L
NaNM
NaNA
NaN- -B
NaNC
NaNO

我需要对齐col 1和col 2,如df 2所示

df2 = pd.DataFrame(data={'col1': ["Sun","Sea:", "SARS-COV-2", "Hong-Kong", "Fish"],
                        'col2': ["Sun", "Sea:", "SARS-COV-2", "Hong-Kong", "Fish"],
                        'col3': ["H", "Q", "X",  "A",'O']})
df2
col1col2col3
太阳太阳H
海:海:Q
SARS-COV-2SARS-COV-2X
香港香港A
O

也就是说,我必须递归地合并col 2的字符串,直到与col 1匹配,同时保留第一个col 3值
我最初的方法是使用嵌套循环,但它变得非常混乱。
有什么想法吗?先谢了

6mzjoqzu

6mzjoqzu1#

您可以将col1拆分为非字母数字字符'\W',以获得与col2相同的输出:

# Assume NaN is np.nan and not 'NaN' else use .replace('NaN', np.nan).dropna()
grp = (df['col1'].dropna().str.split('(\W)').explode().loc[lambda x: x != ''])

df1 = df.groupby(grp.index).agg({'col2': lambda x: ''.join(x), 'col3': 'first'})
out = pd.concat([df['col1'].dropna(), df1], axis=1)

输出:

>>> out
         col1        col2 col3
0         Sun         Sun    H
1        Sea:        Sea:    Q
2  SARS-COV-2  SARS-COV-2    X
3   Hong-Kong   Hong-Kong    A
4        Fish        Fish    O

相关问题