Как прописные сокращения в датафрейме - PullRequest
2 голосов
/ 25 апреля 2020

У меня есть фрейм данных 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

Поскольку многие компании go обозначены аббревиатурой или сокращением (строки 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()?

Ответы [ 5 ]

1 голос
/ 25 апреля 2020

Таким образом, вы можете использовать модуль enchant, чтобы узнать, является ли оно словарным словом или нет. Учитывая, что вы все еще будете иметь некоторые результаты IE Uber.

Вот код, который я придумал, извините за ужасные имена переменных, а что нет.

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
0 голосов
/ 25 апреля 2020

В качестве обходного пути можно добавить такие слова, как «uber»

from nltk.corpus import words

dict_words = words.words()
dict_words.append('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)

Вывод:

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

Загрузить nltk версия пакета по runnning:

import nltk
nltk.download()

Демо:

from nltk.corpus import words

"new" in words.words()

Вывод:

 False
0 голосов
/ 25 апреля 2020

Вот рабочее решение, которое использует список слов engli sh. Только это не точно для 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

Примечание : я также пробовал это с Пакет nltk, но, по-видимому, модуль nltk.corpus.words далеко не завершен словами engli sh.

0 голосов
/ 25 апреля 2020

Это даст вам первое слово в строке и сделает его верхним только для тех названий компаний, которые включены в список 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 голосов
/ 25 апреля 2020

Вы можете сначала отделить первые слова и другие части. Затем отфильтруйте эти первые слова по логике c:

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 York также изменяется):

     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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...