Python 如何在数据框中使用大写首字母缩写词

Python 如何在数据框中使用大写首字母缩写词,python,string,pandas,replace,Python,String,Pandas,Replace,我有一个数据框df,其中包含我需要整齐格式化的公司名称。名称已在标题栏中: Company Name 0 Visa Inc 1 Msci Inc 2 Coca Cola Inc 3 Pnc Bank 4 Aig Corp 5 Td Ameritrade 6 Uber Inc 7 Costco Inc 8 New York Times 由于许多公司使用首字母

我有一个数据框
df
,其中包含我需要整齐格式化的公司名称。名称已在标题栏中:

      Company Name     
0         Visa Inc    
1         Msci Inc
2    Coca Cola Inc
3         Pnc Bank
4         Aig Corp
5    Td Ameritrade 
6         Uber Inc
7       Costco Inc
8   New York Times
由于许多公司使用首字母缩写或缩写(行
1
3
4
5
),我只希望这些公司名称中的第一个字符串为大写,如下所示:

      Company Name     
0         Visa Inc    
1         MSCI Inc
2    Coca Cola Inc
3         PNC Bank
4         AIG Corp
5    TD Ameritrade 
6         Uber Inc
7       Costco Inc
8   New York Times
我知道我无法获得100%的准确替换,但我相信,只有在以下情况下,我才能通过上套管接近第一根管柱:

  • 只有4个或更少的字符
  • 第一个字符串不是字典中的单词

我如何通过以下方式实现这一点:
df['Company Name']=df['Company Name'].replace()

您可以首先将第一个单词和其他部分分开。然后根据您的逻辑过滤第一个单词:

company_list = ['Visa']

s = df['Company Name'].str.extract('^(\S+)(.*)')

mask = s[0].str.len().le(4) & (~s[0].isin(company_list))
df['Company Name'] = s[0].mask(mask, s[0].str.upper()) + s[1]
输出(请注意,
NEW
中的
NEW
也会发生更改):


这将从字符串中获取第一个单词,并使其仅在
include
列表中包含的公司名称中位于上方:

import pandas as pd
import numpy as np

company_name = {'Visa Inc', 'Msci Inc', 'Coca Cola Ins', 'Pnc Bank'}

include = ['Msci', 'Pnc']

df = pd.DataFrame(company_name)
df.rename(columns={0: 'Company Name'}, inplace=True)

df['Company Name'] = df['Company Name'].apply(lambda x: x.split()[0].upper() + ' ' + x[len(x.split()[0].upper()):] if x.split()[0].strip() in include else x)


df['Company Name']
输出:

0        MSCI  Inc
1    Coca Cola Ins
2        PNC  Bank
3         Visa Inc
Name: Company Name, dtype: object
0          Visa Inc
1          Msci Inc
2     Coca Cola Inc
3          PNC Bank
4          AIG Corp
5     TD Ameritrade
6          Uber Inc
7        Costco Inc
8    New York Times
 False

因此,您可以实际使用enchant模块来确定它是否是字典中的单词。考虑到你仍然会有一些不良结果,例如优步


这是我写的代码,很抱歉变量的名字太糟糕了

import enchant
import pandas as pd


def main():
    d = enchant.Dict("en_US")
    listofcompanys = ['Msci Inc',
                      'Coca Cola Inc',
                      'Pnc Bank',
                      'Aig Corp',
                      'Td Ameritrade',
                      'Uber Inc',
                      'Costco Inc',
                      'New York Times']

    dataframe = pd.DataFrame(listofcompanys, columns=['Company Name'])
    for index, name in dataframe.iterrows():
        first_word = name['Company Name'].split()
        is_word = d.check(first_word[0])
        if not is_word:
            name['Company Name'] = first_word[0].upper() + ' ' + first_word[1]

    print(dataframe)



if __name__ == '__main__':
    main()
这方面的产出是:

         Company Name
0        MSCI Inc
1   Coca Cola Inc
2        PNC Bank
3        AIG Corp
4   TD Ameritrade
5        UBER Inc
6      Costco Inc
7  New York Times

这里有一个有效的解决方案,它使用英语单词列表。只是对于
td
uber
,它并不准确,但正如您所说,这很难达到100%的准确度

url = 'https://raw.githubusercontent.com/dwyl/english-words/master/words_alpha.txt'

words = set(pd.read_csv(url, header=None)[0])

w1 = df['Company Name'].str.split()
m1 = ~w1.str[0].str.lower().isin(words) # is not an english word
m2 = w1.str[0].str.len().le(4) # first word is < 4 characters

df.loc[m1 & m2, 'Company Name'] = w1.str[0].str.upper() + ' ' + w1.str[1:].str.join(' ')

     Company Name
0        Visa Inc
1        MSCI Inc
2   Coca Cola Inc
3        PNC Bank
4        AIG Corp
5   Td Ameritrade
6        UBER Inc
7      Costco Inc
8  New York Times
url='1〕https://raw.githubusercontent.com/dwyl/english-words/master/words_alpha.txt'
words=set(pd.read\u csv(url,header=None)[0])
w1=df['Company Name'].str.split()
m1=~w1.str[0].str.lower().isin(words)#不是英语单词
m2=w1.str[0].str.len().le(4)#第一个单词<4个字符
df.loc[m1和m2,'公司名称']=w1.str[0].str.upper()+''+w1.str[1:][.str.join('')
公司名称
0维萨公司
1摩根士丹利资本国际公司
可口可乐公司
3 PNC银行
4美国国际集团公司
5TD美国贸易
6优步公司
7好市多公司
8《纽约时报》

注意:我也在
nltk
软件包中尝试了这一点,但显然,
nltk.corpus.words
模块还没有完成英语单词的编写。

手动解决方法可能是添加“uber”之类的单词

创建一个新列

df.apply(lambda x : x['Company Name'].replace(x['Company Name'].split(" ")[0].strip(), x['Company Name'].split(" ")[0].strip().upper()) 
         if len(x['Company Name'].split(" ")[0].strip()) <= 4 and x['Company Name'].split(" ")[0].strip().lower() not in dict_words
         else x['Company Name'],axis=1)
通过运行以下命令下载nltk包版本:

import nltk
nltk.download()
演示:

输出:

0        MSCI  Inc
1    Coca Cola Ins
2        PNC  Bank
3         Visa Inc
Name: Company Name, dtype: object
0          Visa Inc
1          Msci Inc
2     Coca Cola Inc
3          PNC Bank
4          AIG Corp
5     TD Ameritrade
6          Uber Inc
7        Costco Inc
8    New York Times
 False

老实说,这并不容易,因为如果你想用手来做这些事情。你的逻辑是什么?是的,我知道这不会是完美的,但我想我可以通过使用上述规则的组合达到80%。剩下的我可以手动清理。不过我没有一个现有的公司列表可供比较。这就是为什么我认为排除字典中已经存在的单词以及超过一定长度的单词可能是更好的方法。您当然可以将单词字典传递到
isin
,而不是
company\u list
。我只是举个例子。这不起作用,因为它将不应该的单词大写(例如,Visa和Coca)。不过,这两个词都是字典中的实际单词,因此我建议不要使用大写字母作为字典单词的规则。@MSD现在它按照您建议的方式工作,但是首先创建一个包含你想大写的缩写的列表是有开销的。是的,我需要避免这样做,因为我不会提前知道缩写。Uber是一个单词,但是()?既然Costco大于4个字符,为什么要大写呢?很抱歉wordster是merriam webster网站的python包装器,来自wordster import wordster#获取给定单词打印的不同含义列表(wordster.find_means(“uber”))输出:[“未找到结果”]找不到uber的任何定义,但它不是uber一个单词(merriam webster.com/dictionary/über-)?还有,既然它不是一个词,为什么不将
TD
大写。它不是完美的,就像你说的,这永远都不是完美的解决方案。这应该可以达到你所期望的80%。是的,我想这最接近我了。谢谢你的帮助。