Python Pandas частичное совпадение списка строк в кадре данных - PullRequest
2 голосов
/ 10 июля 2020

Привет всем, я пытаюсь сопоставить частичную строку в столбцах во фрейме данных и вернуть строку сопоставления (дело с заглавными буквами). У меня нет сильных знаний в области программирования, и я просто начинаю учиться.

#list of State
state_abbrv = ["AL","AK","AZ","AR","CA","CO","CT","DE","FL","GA","HI","ID","IL","IN","IA","KS","KY","LA",
        "ME","MD","MA","MI","MN","MS","MO","MT","NE","NV","NH","NJ","NM","NY","NC","ND","OH","OK",
        "OR","PA","RI","SC","SD","TN","TX","UT","VT","VA","WA","WV","WI","WY"]

#Create dataframe 
d = {"Index": [1, 2, 3, 4, 5 , 6, 7], "Description": ["ABNY", "MANY", "NYNY","DO", "nyNY", ""CWARD NY", "HOWARD BEACH NY"]}

df = pd.DataFrame(data=d)

Вот df:

Index Description 
1           ABNY         
2           MANY         
3           NYNY         
4           DO           
5           nyNY         
6           CWARD NY       
7           HOWARD BEACH NY   

Вот мой код:

df = df.assign(State = df["Description"].str.findall(state_abbrv))

И вот ожидаемый результат:

Index Description State
1     ABNY         NY
2     MANY         MA,NY
3     NYNY         NY,NY
4     DO           
5     nyNY         NY
6     CWARD NY     WA,NY 
7     HOWARD BEACH NY WA,AR,NY

Спасибо

Ответы [ 2 ]

3 голосов
/ 10 июля 2020

Вы можете попробовать с join, а затем использовать str.findall:

statesjoin='|'.join(state_abbrv)
df=df.assign(State = df["Description"].str.findall(statesjoin))

Вывод:

df
   Index Description     State
0      1        ABNY      [NY]
1      2        MANY  [MA, NY]
2      3        NYNY  [NY, NY]
3      4          DO        []
4      5        nyNY      [NY]
5      6      ABALBB      [AL]
6      7        ALCA  [AL, CA]

В возможном случае, описанном @AkshaySehgal, вы можете попробовать это :

import re
df=df.assign(State = df["Description"].apply(lambda x: ','.join(re.findall('..',x))).str.findall(statesjoin))
1 голос
/ 10 июля 2020

Вместо объединения всех аббревиатур состояний в одну строку и их использования (что может привести к неверным результатам, если некоторые сокращения заканчиваются и начинаются с похожих символов), вы можете использовать это -

def get_common(s):
    parts = set(map(''.join, zip(*[iter(s)]*2))) #Break string into 2 length tokens
    common = ', '.join(list(parts.intersection(set(state_abbrv)))) #intersection between tokens and abbrevations
    return common

df['State'] = df['Description'].apply(get_common)
Index Description State
1     ABNY         NY
2     MANY         MA,NY
3     NYNY         NY,NY
4     DO           
5     nyNY         NY
6     ABALBB       AL 
7     ALCA         AL,CA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...