Объединить две записи в пандах на основе доверия отдельных столбцов

Недавно я начал работать с Pandas (начинающий Python). Я пытаюсь объединить две записи с разными идентификаторами и создать окончательную запись, которая содержит значения для каждого столбца из идентификаторов, которым я доверяю для каждого столбца.

df1:
ID   NAME     ADDRESS    PHONE
1    abc      street1     9999

df2:
ID   NAME     ADDRESS    PHONE
2    xyz      street2     8888

df_col_priority:
COLUMN   PRIORITY_BY_ID
NAME        1
ADDRESS     2
PHONE       2

Итак, здесь, в зависимости от приоритета каждого столбца для каждого идентификатора, я должен получить одну выходную запись как:

df_output:
NAME      ADDRESS    PHONE
abc       street2     8888    

Итак, в основном я должен получить NAME из ID = 1 и другие 2 поля из ID = 2.
Точно так же у меня есть тысячи записей, для которых я выберу пару из двух записей с помощью логики и вычислю окончательную выходную запись, используя вышеуказанный метод.

Я не могу придумать способ добиться этого, кроме как перебирать каждый столбец для каждого фрейма данных, извлекать приоритет и создавать новую запись столбец за столбцом с помощью concat. Но я считаю, что это довольно неэффективно. Любая помощь будет оценена по достоинству.

вы пытаетесь получить имя из df1, а адрес и телефон из df2? Я думаю, вам нужно предоставить более крупные входные и выходные образцы для получения точного ответа.

Ashish Acharya 01.05.2018 17:43

Да, я хочу получить имя из строки ID = 1 и адрес, телефон из строки ID = 2, потому что приоритет для NAME - выбрать из ID = 1, а приоритет для адреса и телефона - выбрать из ID = 2.

mukkira149 01.05.2018 20:25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
55
1

Ответы 1

Возможно, я неправильно понимаю вашу проблему, но в любом случае кажется, что было бы полезно вернуться к тому, как вы организуете свои фреймы данных. При этом это решение, каким бы неэлегантным оно ни было, работает в вашем случае:

# start by concatenating df1 and df2 into one dataframe
full_df = pd.concat([df1, df2])
# create an empty output dataframe with the columns you want
df_output = pd.DataFrame(columns = df1.columns[1:])
# loop through your df_col_priority, making a series of your desired values,
# appending that series to df_output
# this uses a list iteration
df_output = df_output.append(pd.Series(
    [full_df.loc[full_df.ID == row.PRIORITY_BY_ID, row.COLUMN].values[0]
     for _, row in df_col_priority.iterrows()],
    index=df_col_priority.COLUMN), ignore_index=True)

Ваш df_output будет выглядеть так:

>>> df_output
  NAME  ADDRESS PHONE
0  abc  street2  8888

Как вы предлагаете реорганизовать фреймы данных?

mukkira149 01.05.2018 20:28

Для начала, я бы сохранил все ваши наблюдения (доверенные или нет) в одном и том же фрейме данных (я добился этого в этой первой строке full_df = pd.concat([df1, df2]), но это может быть проблемой или потребовать цикла, если у вас есть куча фреймов данных)

sacuL 01.05.2018 22:17

Другие вопросы по теме