Найти значение, которое является подмножеством строки в кадре данных Pandas - PullRequest
0 голосов
/ 05 июля 2018

Это аскутное последующее решение / вопрос к одному из моих других вопросов: Python Pandas сравнивает два кадра данных, чтобы назначить страну для номера телефона

У нас есть два фрейма данных:

df1 = pd.DataFrame({"TEL": ["49123410", "49123411","49123412","49123413","49123414","49123710", "49123810"]})
df2 = pd.DataFrame({"BASE_NR": ["491234","491237","491238"],"NAME": ["A","B","C"]})

То, что я хочу сделать, - это присвоить имена df2 TEL df1. Если мы возьмем первое значение «491234», мы увидим, что первые пять записей списка в df1 начинаются именно с этой строки. Это должно привести к примерно так:

|   | TEL      | PREFIX |
| 0 | 49123410 | 491234 |
| 1 | 49123411 | 491234 |
| 2 | 49123412 | 491234 |
| 3 | 49123413 | 491234 |
| 4 | 49123414 | 491234 |
| 5 | 49123710 | 491237 |
| 6 | 49123810 | 491238 |

За исключением Python Pandas сравнивает два кадра данных, чтобы назначить страну для номера телефона

Я разработал другой подход, который работает намного быстрее:

for i, s in df2.iterrows():
    df1.loc[df1["TEL"].str.startswith(s[0], na=False), "PREFIX"] = s[0]

Пока что он работал отлично, и я использовал его снова и снова, так как мне нужно сопоставлять множество различных источников по телефонным номерам и их подмножествам. Но в последнее время я испытываю все больше и больше проблем. Столбец PREFIX будет настроен, но останется пустым. Больше не найдено ни одного совпадения, где раньше у меня было около 150 000.

Есть ли что-то фундаментальное, чего мне не хватает, и было ли это просто удачей, что это сработало? Входные файлы (я читаю их из CSV) и типы данных не изменились. Я также не изменил версию Pandas (22).

PS: Также было бы полезно узнать, как отладить ту часть, которая происходит здесь:

df1.loc[df1["TEL"].str.startswith(s[0], na=False), "PREFIX"] = s[0]

1 Ответ

0 голосов
/ 05 июля 2018

Ну, если вам нужна скорость, она должна быть быстрее:

mapping = dict(zip(df2['BASE_NR'].tolist(), df2['NAME'].tolist()))

def getName(tel):
    for k, v in mapping.items():
        if tel.startswith(k):
            return k, v
    return '', ''

df1['BASE_NR'], df1['NAME'] = zip(*df1['TEL'].apply(getName))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...