Как заменить значения в столбце DataFrame на значения из другого DataFrame по условию
Не могу решить одну задачку. У меня есть DataFrame, он состоит из номеров IMSI. IMSI- это международный идентификатор мобильного абонента (индивидуальный номер абонента).
IMSI=MCC+MNC+MSIN
MCC = Mobile Country Code (код страны), 3 цифры
MNC = Mobile Network Code (код сети), 1–3 цифры
MSIN = Mobile Station Identificator Number (код станции, "вышки") – x1-x10, 9–10 цифр - это не пригодиться
Тут справочники по всем MCC и MNC
Для России это примерно так:
Видно, что у России MCC=250
Также есть мой DataFrame, в котором есть список IMSI.
Примерно такое в нем:
В чем суть задачи, я пытаюсь парсить IMSI в моей таблице для создания столбца ['MCC'] и ['MNC']. С созданием ['MCC'] проблем не возникло. Код ниже:
subset=pd.read_csv('imsi.csv',sep=';')
mcc=pd.read_csv('mcc-mnc-operator-list.csv',sep=';')
subset["IMSI"]=subset["IMSI"].astype('str')
subset['MCC']=subset["IMSI"].str.extract(r"(\d{3})")
subset['MCC']=subset['Mobile Country Code'].astype('int')
dict_mcc=dict(zip(mcc['MCC'],mcc['Country']))
subset['Государство']=subset['MCC'].map(dict_mcc)
Вот что получилось:
А вот как сделать столбец ['MNC'] у меня не получается. Тут значения могут быть от 1-3, и тут весь затык. Как это парсить, не могу понять.
Ответы (1 шт):
Попробуйте делать объединение по столбцу MCCMNC из справочника и соответствующей подстрокой из IMSI в рабочей таблице.
mcc = pd.read_csv("mcc-mnc-operator-list.csv", sep=";", dtype={"MNC":str}, encoding="latin-1")
df = pd.read_csv("imsi.scv", index_col=0, parse_dates=["Дата создания"], dtype={"IMSI": str})
mcc2 = mcc.drop(columns="Network / operator").drop_duplicates()
res = df.assign(MCCMNC=df["IMSI"].str[:6]).merge(mcc2).append(df.assign(MCCMNC=df["IMSI"].str[:5]).merge(mcc2))
# let's take care of unmatched records
ids = res["IMSI"]
res.append(df.query("IMSI not in @ids"))
результат:
In [153]: res
Out[153]:
Дата создания IMSI MCCMNC MCC MNC Country
0 2021-01-02 16:51:20 250992221922154 25099 250.0 99 Russia
1 2021-01-29 16:34:01 250992212048656 25099 250.0 99 Russia
2 2021-01-02 14:18:48 250992212446822 25099 250.0 99 Russia
3 2021-01-28 17:44:58 250992222903343 25099 250.0 99 Russia
4 2021-01-28 17:05:03 250992101281658 25099 250.0 99 Russia
.. ... ... ... ... ... ...
68 2021-01-29 10:12:40 250621000406994 NaN NaN NaN NaN
132 2021-01-29 16:05:06 250621004596443 NaN NaN NaN NaN
136 2021-01-02 13:39:14 250621000406994 NaN NaN NaN NaN
157 2021-01-02 12:09:55 250621000474943 NaN NaN NaN NaN
409 2021-01-02 12:50:28 250621001335819 NaN NaN NaN NaN
[603 rows x 6 columns]
PS строки с NaN-ми соответствуют тем IMSI, для которых в справочнике не существует соответствующих MCC и MNC, как, например 250 и 62.


