首页 > 解决方案 > Python Pandas,多个相同分隔符后出现的所有文本

问题描述

我想将文本“[Unique ID]”后面的数字拉到下一个空格。然后,我想创建一个新列,以显示已提取的每个唯一 UID。

我能够抓住第一次出现,但无法抓住所有出现。

这是我一直在使用的代码:

    from pandas import DataFrame

    Info = {'ID': ['1','2','3'],
        'Name': ['Tom Johnson', 'Ben Thompson', 'Mike'],
        'Information': ["[Age] 22 [Height] 6'2 [Unique ID] 1424 [Unique ID] 1438 [Unique ID] 1439","[Age] 21 [Height] 6'0 [Unique ID] 1101 [Unique ID] 1101","[Age] 20 [Height] 6'3 [Unique ID] 1424 [Unique ID] 1498"]}

    df = DataFrame(Info,columns= ['ID', 'Name', 'Information'])


    df['UID'] = [df.split("[Unique ID] ")[1].split(" ")[0] for df in df['Information']]

如您所见,它只会抓取“[Unique ID]”之后的第一次出现。但是,我想要所有的事件。

期望的输出是,

    Info2 = {'ID': ['1','1','1','2','3','3'],
        'Name': ['Tom Johnson', 'Tom Johnson', 'Tom Johnson', 'Ben Thompson', 'Mike', 'Mike'],
        'Information': ["[Age] 22 [Height] 6'2 [Unique ID] 1424 [Unique ID] 1438 [Unique ID] 1439",
                        "[Age] 22 [Height] 6'2 [Unique ID] 1424 [Unique ID] 1438 [Unique ID] 1439",
                        "[Age] 22 [Height] 6'2 [Unique ID] 1424 [Unique ID] 1438 [Unique ID] 1439",
                        "[Age] 21 [Height] 6'0 [Unique ID] 1101 [Unique ID] 1101",
                        "[Age] 20 [Height] 6'3 [Unique ID] 1424 [Unique ID] 1498",
                        "[Age] 20 [Height] 6'3 [Unique ID] 1424 [Unique ID] 1498"],
        'UID': ['1424','1438', '1439', '1101', '1424', '1498']}

    df2 = DataFrame(Info2,columns= ['ID','Name', 'Information', 'UID'])

如图所示,每个记录都有唯一的 UID,如果记录包含多个相同的 UID,则不会创建新记录。

谢谢!

标签: pythonpandas

解决方案


你可以使用str.split和`融化:

new_df = pd.concat((df[['Name', 'Information']],
                    df.Information.str.split('\[Unique ID\]', expand=True)),
               axis=1)
new_df.drop(0, axis=1, inplace=True)

(new_df.melt(id_vars=['Name', 'Information'], 
            value_name='UID')
       .drop('variable', axis=1)
       .dropna()
)

输出

           Name                                        Information     UID
0   Tom Johnson  [Age] 22 [Height] 6'2 [Unique ID] 1424 [Unique...   1424 
1  Ben Thompson  [Age] 21 [Height] 6'0 [Unique ID] 1101 [Unique...   1101 
2          Mike  [Age] 20 [Height] 6'3 [Unique ID] 1424 [Unique...   1424 
3   Tom Johnson  [Age] 22 [Height] 6'2 [Unique ID] 1424 [Unique...   1438 
4  Ben Thompson  [Age] 21 [Height] 6'0 [Unique ID] 1101 [Unique...    1101
5          Mike  [Age] 20 [Height] 6'3 [Unique ID] 1424 [Unique...    1498
6   Tom Johnson  [Age] 22 [Height] 6'2 [Unique ID] 1424 [Unique...    1439

推荐阅读