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

4

我有以下的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))
3个回答

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

3
您可以使用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

请看正则表达式演示,根据需要支持的数字类型和单词边界类型可以调整正则表达式。
当前的匹配模式如下:
- \b(?!\d+\b)(\w)\w* - 匹配一个单词边界,然后是一个单词字符(捕获到第一组),再接着零个或多个单词字符,但这些单词字符不能作为一个整体构成数字序列。 - | - 或 - \s+ - 一个或多个空白字符。
如果第一组匹配成功,则将其大写并替换,否则删除匹配项(替换为空字符串)。

0

您可以迭代列项并通过空格拆分项提取单词,然后使用单词的第一个字母创建新单词并将其保存到列表中,然后将此列表添加到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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接