Недавно я начал работать с 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. Но я считаю, что это довольно неэффективно. Любая помощь будет оценена по достоинству.
Да, я хочу получить имя из строки ID = 1 и адрес, телефон из строки ID = 2, потому что приоритет для NAME - выбрать из ID = 1, а приоритет для адреса и телефона - выбрать из ID = 2.
Возможно, я неправильно понимаю вашу проблему, но в любом случае кажется, что было бы полезно вернуться к тому, как вы организуете свои фреймы данных. При этом это решение, каким бы неэлегантным оно ни было, работает в вашем случае:
# 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
Как вы предлагаете реорганизовать фреймы данных?
Для начала, я бы сохранил все ваши наблюдения (доверенные или нет) в одном и том же фрейме данных (я добился этого в этой первой строке full_df = pd.concat([df1, df2])
, но это может быть проблемой или потребовать цикла, если у вас есть куча фреймов данных)
вы пытаетесь получить имя из df1, а адрес и телефон из df2? Я думаю, вам нужно предоставить более крупные входные и выходные образцы для получения точного ответа.