Пример таблицы фиктивных данных приведен ниже. Эти данные включают в себя идентификаторы учащихся, имена родителей, родственные связи, номера телефонов, электронные письма, адреса и еще несколько вещей. Моя проблема заключается в том, чтобы объединить родителей, таких как Элис Джонсон, в один идентификатор, используя Python и Pandas.
Фиктивные родительские данные
номер студента
приоритет
dcid
имя родителя
проживает с
законным опекуномrel
частный телефон
рабочий телефон
сотовый
электронная почта
улица
city_state_zip
студентская улица
студент fn
10000001
1
100001
(Союзник) Элис Джонсон
1< /td>
1
Мать
555-123-4567
555-987-6543
alice.johnson@example.com
123 Main St
Anytown, США 12345
Джонсон
Лиам
10000004
1
100004
Алиса Элли Джонсон
1
1
Мать
555 -123-4567
555-987-6543
alice.johnson@example.com< /td>
123 Main St NE
Anytown, США 12345
Джонсон
< td>Дэвид
10000003
2
100003
Элис Джонсон
1
1
< td>Юридический представитель
555-123-4568
555-123-4568
alice.johnson@example.com
780 Elm St
Anytown, США 12345
Сенна
Кэрол
100000022
100002
Боб Смит
1
1
Другое
555-555-5555
555-555-5554
555-555-5555
bob.smith@example.com
456 Oak St
Anytown, США 12345
Смит
Роберт
10000005
1
100005
Бобби Боб Смит
1
1
Отец
555 -555-5555
555-555-5555
bob.smith@example.com< /td>
456 Oak St
Anytown, США 12345
Смит
Эмили
10000006
1
< td>100006
Фрэнк Тейлор – НЕ СВЯЗЫВАТЬСЯ
1
0
Отец
555-777-8888
555-999-0000< /td>
frank.taylor@example.com
654 Oak St
Anytown, США 12345
Тейлор
Фрэнки
10000007
2
100007
Грейс Мартинес
0
1
Мать
555-123-7890
grace.martinez@example.com
Мейпл-стрит, 321
Anytown, США 12345
Мартинес
Чейз
10000008
2
100008
Генри Родригес
1
1
Отец
555-987-6543
555-321-6543
789 Elm St
Anytown, США 12345
Родригес
Кэрол
10000009
2
100009
Изабелла Эрнандес
1
1
Мать
555-555 -5555
555-123-4567
555-666-7777
isabella.hernandez@example .com
456 Oak St
Anytown, США 12345
Эрнандес
Джон
10000010
2
100010
Джейкоб Гонсалес
1
1
Отец
555-444-3333
555-222-1111
555- 777-9999
jacob.gonzalez@example.com
321 Cedar St
Anytown, США 12345
Гонсалес
Кэтрин
10000011
2
100011
Кэтрин Ли
1
1
Мать
555-321-4567
555-987-6543
katherine.lee@example.com
789 Pine St< /td>
Anytown, США 12345
Ли
Лиам
10000012
2
100012
Лиам Нгуен
1
1
Отец
555 -888-7777
555-555-5555
555-123-4567
liam.nguyen @example.com
987 Cedar St
Anytown, США 12345
НгуенМиа
10000013
2
100013
Миа Перес
1
1Мать
555-222-1111
555-666-7777
555-333-4444
321 Elm St
Anytown, США 12345Перес
Нэнси
10000014
2
100014
Оливия Адамс (в Британской Колумбии)
0< /td>
1
Мать
555-666-9999
555-999-6666
olivia.adams@example.com
987 Elm St ne< /td>
Anytown, США 12345
Адамс
Миа
10000015
2
100015
Оливия Адамс (Британская Колумбия)
0
1
Мать
555-111-2222
555-333-4444
olivia.adams@ example.com
неизвестно
Anytown, США 12345
Адамс
Патрик
10000016
2
100016
Оливия Адамс (в Британской Колумбии)
0
1
Мать
555-444-5555
555-222- 1111
olivia.adams@example.com
987 Elm St
Anytown, США 12345
Адамс
Серена
У меня возникли проблемы с точным определением одного идентификатора для каждого родителя без перезаписи родительских данных или отсутствия родителей, имеющих псевдонимы.
Пока мне удалось это сделать. прочитать данные в фрейм данных. Я предварительно обработал данные, чтобы попытаться свести к минимуму дубликаты, задав строки строчными буквами и удалив пробелы. Ниже я также объединил данные, чтобы объединить столбцы с номерами телефонов в один столбец для каждого студента. Я удалил дубликаты из всех столбцов.
Код: Выделить всё
data = pd.read_csv(
"archive/pall_cust.csv"
)
data["street"] = data["street"].str.lower()
data["email"] = data["email"].str.lower()
data["street"] = data["street"].astype("string")
data["parent_name"] = data["parent_name"].astype("string")
data["parent_name"] = data["parent_name"].str.strip()
data["parent_name"] = data["parent_name"].str.title()
phone_df = pd.melt(
data,
id_vars=["dcid", "priority"],
value_vars=["priphone", "workphone", "cell"],
var_name="phonetype",
value_name="phonenumberasentered",
)
phone_df.sort_values("dcid")
phone_df.dropna(subset=["phonenumberasentered"], inplace=True)
dup = phone_df.duplicated(
subset=["dcid", "priority", "phonenumberasentered"], keep="first"
)
phone_df.loc[dup, ["phonetype", "phonenumberasentered"]] = None
phone_df.to_csv("phone.csv")
merged_df = pd.merge(data, phone_df, on=["priority", "dcid"], how="left").drop(
columns=["priphone", "workphone", "cell", "entry_date", "school"]
)
merged_df.drop_duplicates(
subset=[
"parent_name",
"dcid",
"liveswith",
"legalguardian",
"rel",
"email",
"phonenumberasentered",
"street",
"city_state_zip",
"ln",
"fn",
"studentnumber",
],
inplace=True,
)
Код: Выделить всё
max_student = merged_df.loc[
merged_df.groupby(
["priority", "rel", "street", "city_state_zip", "phonenumberasentered"]
)["dcid"].idxmax()
]
parent_names_from_max = max_student.set_index(
["priority", "rel", "street", "city_state_zip", "phonenumberasentered"]
)["parent_name"]
merged_df["parent_name"] = merged_df.set_index(
["priority", "rel", "street", "city_state_zip", "phonenumberasentered"]
).index.map(parent_names_from_max)
merged_df.reset_index(drop=True, inplace=True)
parent_to_id = {
value: idx + 1 for idx, value in enumerate(merged_df["parent_name"].unique())
}
merged_df.loc[:, "New Contact Identifier"] = merged_df["parent_name"].map(parent_to_id)
Подробнее здесь: https://stackoverflow.com/questions/783 ... arent-in-t