Если слияние панд находит несколько совпадений, запишите значения строк в одно поле - PullRequest
0 голосов
/ 30 апреля 2018

Я не очень хорошо представлял, как сформулировать хороший заголовок.

Ситуация такова, что у меня есть два фрейма данных, которые я хочу объединить:

df1 = pd.DataFrame([[1, 2], [1, 3], [4, 6]], columns=['A', 'ID'])
df2 = pd.DataFrame([[3, 2], [3, 3], [4, 6]], columns=['ID', 'values'])

так что я делаю:

pd.merge(df1, df2, on="ID", how="left")

, что приводит к:

   A   ID    values
0  1   2     NaN
1  1   3     2.0
2  1   3     3.0
3  4   6     NaN

Хотя мне хотелось бы, чтобы любая комбинация A и ID появлялась только один раз. Если их было несколько, как в примере выше, он должен принять соответствующие значения и объединить их в список (?) Значений. Поэтому результат должен выглядеть следующим образом:

   A   ID    values
0  1   2     NaN
1  1   3     2.0, 3.0
2  4   6     NaN

У меня нет ни малейшего представления, как к этому подойти.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Вы можете использовать

merged = pd.merge(df1, df2, on="ID", how="left") \
           .groupby(['A', 'ID'])['values'] \
           .apply(list) \
           .reset_index()

как в точном ответе asongtoruin, но вы можете рассмотреть случай только None как особый (из-за слияния), в этом случае вы можете использовать

    >>> df['values'].groupby([df.A, df.ID]).apply(lambda g: [] if g.isnull().all() else list(g)).reset_index()
    A   ID  values
0   1   2   []
1   1   3   [2.0, 3.0]
2   4   6   []
0 голосов
/ 30 апреля 2018

Получив объединенный фрейм данных, вы можете groupby столбцы A и ID, а затем просто применить list к столбцу values, чтобы объединить результаты в список для каждой группы:

import pandas as pd

df1 = pd.DataFrame([[1, 2], [1, 3], [4, 6]], columns=['A', 'ID'])
df2 = pd.DataFrame([[3, 2], [3, 3], [4, 6]], columns=['ID', 'values'])

merged = pd.merge(df1, df2, on="ID", how="left") \
           .groupby(['A', 'ID'])['values'] \
           .apply(list) \
           .reset_index()

print(merged)

печать:

   A  ID      values
0  1   2       [nan]
1  1   3  [2.0, 3.0]
2  4   6       [nan]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...