Что мне делать при объединении фреймов данных в python, если во фрейме есть элемент списка? (нехешируемый тип: ‘список’)

#python #pandas #list #dataframe

#python #pandas #Список #фрейм данных

Вопрос:

У меня есть два фрейма данных, которые мне нужно объединить в строку.

Такие фреймы выглядят так, как показано ниже.

Первый фрейм данных

Второй фрейм данных

Он выдает ошибку (не хэшируемый тип: ‘список’).

Я думаю, что есть проблема с добавлением элементов списка (например) [0, 0, 0, 1] или [0, 0, 1, 0].

Ответ №1:

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

 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'
 

Сначала вы хотите разобраться с неинвестированием. Затем выполните слияние:

 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')