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...
假设我有以下 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...