提取列中每个单词的第一个字符串

2024-05-15 11:43:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我的DF如下所示

col1
GRE MET HOCK 38 
ASS COM CORD EMERG  INIT

我想用col1中每个单词的第一个字符串创建一个列,但保留整数,如下所示

col1                        col2
GRE MET HOCK 38             GMH38
ASS COM CORD EMERG  INIT    ACCEI 

我找到了一些可能有效的方法,但没有达到预期的效果

import re
input = "GRE MET HOCK 38"
output = "".join(item[0].upper() for item in re.findall("\w+", input))

Tags: 字符串recomdfinputinititem单词
3条回答

split将空格上的字符串堆叠成一个长序列。然后,您可以获取第一个字母,除了字符串isnumeric的拆分部分之外,最后加入结果并赋值,这与原始数据帧索引对齐

import pandas as pd
df = pd.DataFrame({'col1': ['GRE MET HOCK 38', 'ASS COM CORD EMERG  INIT']})

s = df['col1'].str.split('\s+', expand=True).stack()
df['col2'] = s.str[0].mask(s.str.isnumeric(), s).groupby(level=0).agg(''.join)

                       col1   col2
0           GRE MET HOCK 38  GMH38
1  ASS COM CORD EMERG  INIT  ACCEI

您可以使用Series.str.replace

import pandas as pd
df = pd.DataFrame({'col':['GRE MET HOCK 38', 'ASS COM CORD EMERG  INIT']})
df['col'].str.replace(r'\b(?!\d+\b)(\w)\w*|\s+', lambda x: x.group(1).upper() if x.group(1) else '', regex=True)
# => 0    GMH38
#    1    ACCEI
#    Name: col, dtype: object

regex demo。根据支持正则表达式所需的数字类型和单词边界类型,可以对正则表达式进行调整

当前模式匹配

  • \b(?!\d+\b)(\w)\w*-一个单词边界,然后是一个单词字符(捕获到组1中,然后是零个或多个单词字符,但这些单词字符不应构成一个完整的数字序列)
  • |-或
  • \s+-一个或多个空白

如果组1匹配,则此大写值为替换值,否则,将删除匹配值(替换值为空字符串)

您可以迭代列项并提取按空格拆分的项的单词,然后使用单词的首字母创建新词并将新词保存到列表中,然后将此列表添加到DataFrame的新列中

from pandas import DataFrame

data = {
    'col1' : ['GRE MET HOCK 38', 'ASS COM CORD EMERG INIT'],
}

new_column = []

df = DataFrame(data)

for item in df['col1']:
    new_item = ""
    #extract words from item with split by space
    words = item.split()
    for word in words:
        #add first letter to new item
        new_item += word[0]
    #add new item to new column
    new_column.append(new_item)


#add new column to DataFrame
df['col2'] = new_column
print(df)

相关问题 更多 >