Есть ли способ сделать слияние, используя панды, где один столбец является списком, а другой столбец может содержать элемент в этом списке? - PullRequest
1 голос
/ 13 июня 2019

Прямо сейчас у меня есть два кадра данных панд:

Первый выглядит так:

id1 features
0   ['a', 'b']
1   ['c', 'd', 'e']
2   ['f']

а второй выглядит так:

id2 features other
224   'a'      3
264   'z'      3
277   'f'      3

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

id1 features other
0    'a'       3 
2    'f'       3

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

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

Я думаю, что вы действительно описали самый эффективный способ сделать это: expanding the first dataframe into multiple rows per value then doing the join.

Другой вариант, который я видел, - это повторение второго. Say

df1 =\
id features
0   ['a', 'b']
1   ['c', 'd', 'e']
2   ['f']

df2 =\
id features other
0   'a'      3
1   'z'      3
2   'f'      3

Сделайте что-то вроде:

features_in_df1 = set(np.flatten(df1.feature.values))

output = []
for _, row in df2.iterrows():
    if row['feature'] in features_in_df1:
        output.append(row)

df_merge = pd.concat(output)
1 голос
/ 13 июня 2019

IIUC

s=df1.merge(df2,on='id')
df2[[y in x for x , y in zip(s.features_x,s.features_y)]]
   id features  other
0   0        a      3
2   2        f      3

Обновление

df2[df2.features.isin(df1.features.sum())]
   id features  other
0   0        a      3
2   2        f      3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...