Объединить две записи в пандах на основе доверия отдельного столбца - PullRequest
0 голосов
/ 01 мая 2018

Я недавно начал работать с 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.
Кроме того, у меня есть тысячи записей, для которых я выберу пару из двух записей по логике и вычислю окончательную выходную запись, используя вышеуказанный метод.

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

1 Ответ

0 голосов
/ 01 мая 2018

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

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...