pandas 数据从字符串中提取信息

pandas data extract info from strings

假设我有以下 DataFrame:

d = {'Name': ['One Stop - Johnny MELAVO;\nN: 468 847 R457\nH: 
06H4155\n (KSMITH)',
'Inpatient - Sonny CROCKETT;\nN: 46X 847 T457\nH: 06H9155\n 
(KSMITH), of which 2 containers have been returned',
'One Stop - Muhammed John ARKANDROID;\nN: 6H1 7R5 6098\nH: 
4072W74\n (PSTAFFORDJ)',
'One Stop - Novillos CURRAN-POCO;\nN: 462 11L 2931\nH: 
F14R917\n (FSABU)'],
'Quantity': [10, 25, 12, 15]}
df = pd.DataFrame(d)

有没有更快(或 pythonic)的方法从名称中提取以下信息,这样我就可以拥有这个?: Jonny MELAVO, 06H4155。 我知道它可以分几个步骤完成,但想知道是否有更好的方法。 谢谢

更新

使用str.extract

df['Name'] = df['Name'].str.extract('-\s+(.*);[^:]+:[^:]+:\s+(.*)\s+\(') \
                       .apply(', '.join, axis=1).values
print(df)

# Output
                                Name  Quantity
0             Johnny MELAVO, 06H4155        10
1            Sonny CROCKETT, 06H9155        25
2  Muhammed John ARKANDROID, 4072W74        12
3      Novillos CURRAN-POCO, F14R917        15

中间结果:

>>> df['Name'].str.extract('-\s+(.*);[^:]+:[^:]+:\s+(.*)\s+\(')
                          0        1
0             Johnny MELAVO  06H4155
1            Sonny CROCKETT  06H9155
2  Muhammed John ARKANDROID  4072W74
3      Novillos CURRAN-POCO  F14R917

旧答案

您可以使用 str.split:

df['Name'] = df['Name'].str.split(r'[-;:\n]', expand=True)[[1, 6]]
                       .apply(','.join, axis=1)
print(df)

# Output
                       Name  Quantity
0    Johnny MELAVO, 06H4155        10
1   Sonny Crockett, 06H9155        25

中间结果:

>>> df['Name'].str.split(r'[-;:\n]', expand=True)
            0                1 2  3              4  5         6                                                  7
0   One Stop     Johnny MELAVO    N   468 847 R457  H   06H4155                                           (KSMITH)
1  Inpatient    Sonny Crockett    N   46X 847 T457  H   06H9155   (KSMITH), of which 2 containers have been ret...