Слияние DataFrame дает больше строк - PullRequest
0 голосов
/ 08 июля 2020

У меня есть два файла CSV, и я хочу использовать два DataFrames для поиска значений в первой таблице. Вот примеры форматов таблиц (с примерами данных в них). Я хочу взять каждое поле электронной почты в DF_SPO ниже и найти значение пользователя во фрейме данных DF_REF , чтобы добавить два новых столбца в таблицу.

DF_SPO
+--------+-------------------+--------------------------+
| tbl_id |      EMAIL1       |          EMAIL2          |
+--------+-------------------+--------------------------+
|      1 | test@example.com  | anotheruser@example.com  |
|      2 | test2@example.com | anotheruser2@example.com |
+--------+-------------------+--------------------------+

DF_HRI
+--------------------------+---------------+
|          email           |   user        |
+--------------------------+---------------+
| test@example.com         | test_user     |
| test2@example.com        | test_user_2   |
| anotheruser@example.com  | another_user  |
| anotheruser2@example.com | another_user2 |
+--------------------------+---------------+


DF_SPO_MERGED
+--------+-------------------+--------------------------+--------------+-----------------+
| tbl_id |       EMAIL1      |           EMAIL2         | primaryUser  |  secondaryUser  |
+--------+-------------------+--------------------------+--------------+-----------------+
|      1 | test@example.com  | anotheruser@example.com  | test_user    | another_user    |
|      2 | test2@example.com | anotheruser2@example.com | test_user_2  | another_user_2  |
+--------+-------------------+--------------------------+--------------+-----------------+

Основываясь на этой диаграмме, вот код, который я использую для поиска каждого адреса электронной почты.

import pandas as pd

df_spo = pd.read_csv("InventoryFeeds-SPO.csv", encoding="utf-8")
df_ref = pd.read_csv("InventoryFeeds-REF.csv", encoding="utf-8", dtype = {'user_num': str})

# Filter Reference Feed to contain only Email & Username
df_ref = df_ref.filter(['email', 'user'])
df_ref.drop_duplicates(subset='email', keep="last")


print(f"DF REF Size - {df_ref.size} | DF REF Shape - {df_ref.shape}")
print(f"DF SPO Size - {df_spo.size} | DF SPO Shape - {df_spo.shape}")

print("=" * 60)

print("MERGING Primary Owner!")
df_spo = df_spo.merge(df_ref, left_on='EMAIL1', right_on="email", how="left")
df_spo.rename(columns={"user": "primaryUser"}, inplace=True)
df_spo.drop('email', axis=1, inplace=True)
print(f"NEW DF SPO Size - {df_spo.size} | NEW DF SPO Shape - {df_spo.shape}")

Первое слияние работает, но я получаю гораздо больше строк, чем я ожидал.

DF HRI Size - 203234 | DF HRI Shape - (101617, 2)
DF SPO Size - 23268 | DF SPO Shape - (1939, 12)
============================================================
MERGING Primary Owner!
NEW DF SPO Size - 3336326 | NEW DF SPO Shape - (238309, 14)

Что-то мне не хватает? Пытаюсь понять, почему у меня получается так много лишних строк в итоговом объединенном фрейме данных.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...