Объединить две панды DataFrame в ячейку, содержащую список - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть два DataFrames, один из которых содержит столбец со списками в его ячейкахВот пример:

DF 1 :
   | A      B
---+----------------------------
0  | 'A'    ['A', 'B']
1  | 'B'    ['B', 'D']
2  | 'C'    ['D', 'E', 'F']

DF 2 :
   | C      D
---+----------------------------
0  | 'A'    'X'
1  | 'B'    'Y'
2  | 'C'    'Z'

Вот код для настройки DataFrames:

df1 = pd.DataFrame({'A': ["A", "B", "C"], "B": [["A", "B"], ["B", "D"], ["D", "E", "F"]]})
df2 = pd.DataFrame({'C': ["A", "B", "C"], "D": ["X", "Y", "Z"]})

Я хотел бы сделать внутреннее соединение между DF1 и DF2 с условием DF2.C in DF1.B,Вот результат, который я ожидаю:

DF1&DF2 :
   | A      B              C      D
---+--------------------------------------
0  | 'A'    ['A', 'B']     'A'    'X'
1  | 'A'    ['A', 'B']     'B'    'Y'
2  | 'B'    ['B', 'D']     'B'    'Y'

Я прочитал документацию , объясняющую, как добиться объединения с использованием concat, но я не могу найти, как использовать тестирование членства в качестве условия соединения.

Я что-то пропустил?Есть идеи как это сделать?

1 Ответ

0 голосов
/ 18 декабря 2018

Это unnesting сначала проблема, затем merge проблема

df3=unnesting(df1,['B'])
df3.merge(df2,left_on='B',right_on='C',how='inner').drop('B',1).merge(df1)
Out[15]: 
   A  C  D       B
0  A  A  X  [A, B]
1  A  B  Y  [A, B]
2  B  B  Y  [B, D]

Функция самоопределения

def unnesting(df, explode):
    idx=df.index.repeat(df[explode[0]].str.len())
    df1=pd.concat([pd.DataFrame({x:np.concatenate(df[x].values)} )for x in explode],axis=1)
    df1.index=idx
    return df1.join(df.drop(explode,1),how='left')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...