объединение двух таблиц относительно множества объектов в ячейке - PullRequest
0 голосов
/ 06 февраля 2019

У меня проблема с соединением между двумя таблицами.И более конкретно, у меня есть первая таблица (Df_1), которая имеет столбец «B» и строки дерева.В каждой строке в столбце «B» у меня есть ячейка с тремя значениями (девять значений в столбце B в трех строках), то есть каждая ячейка имеет массив с тремя значениями.Кроме того, у меня есть два столбца с отдельными значениями.

Во второй таблице у меня девять строк.И столбец «имя», в котором есть данные, такие же, как в первом кадре в столбце «В».Но здесь они разделены, каждый для разных строк.

Я предполагаю, что мне нужен первый кадр, измените его, чтобы иметь девять строк.В смысле этих векторов я должен сломаться.А затем соедините два кадра с этим новым столбцом в первом кадре и столбцами «name» во втором кадре.

Это первый кадр с тремя строками:

Df_1 = pd.DataFrame({
              'A': ['White','Black','Yellow'],
              'B': [['lamp','bed','wardrobe'],['sink','glass','towel'],['kitchen','toilet','room']],
              'C': [4,2,9]
               })

Этовторой кадр с девятью строками:

Df_2 = pd.DataFrame({'Number' :['six','one','nine','ten','four','five','two','three','nine'],
               'Name': ['lamp','bed','wardrobe','sink','glass','towel','kitchen','toilet','room'],
               'Description': ['large','small','loud','weak','loyal','loyal','loud','large','small']})

И это третий кадр, который является основным на первом и втором кадрах.

Df_3 = pd.DataFrame({'A': ['white','white','white','Black','Black','Black','Yellow','Yellow','Yellow'],
              'Name': ['lamp','bed','wardrobe','sink','glass','towel','kitchen','toilet','room'],
              'C': [4,4,4,2,2,2,9,9,9],
              'Description': ['large','small','loud','weak','loyal','loyal','loud','large','small']
              })

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Попробуйте этот подход:

Разнесение Df_1

Использование concat и melt , весьма полезно в этом контексте

#Intermediate step to unpack column B

intermediate_df = pd.concat([Df_1.drop('B', axis='columns'), pd.DataFrame(Df_1.B.values.tolist(), index=Df_1.index, columns=['B1', 'B2', 'B3'])], axis=1)
intermediate_df

    A       C   B1       B2      B3
0   White   4   lamp     bed     wardrobe
1   Black   2   sink     glass   towel
2   Yellow  9   kitchen  toilet  room

Df_1_final = Df_1_extended.melt(id_vars=['A', 'C'], value_name='Type')
Df_1_final

    A       C   variable    Type
0   White   4   B1          lamp
1   Black   2   B1          sink
2   Yellow  9   B1          kitchen
3   White   4   B2          bed
4   Black   2   B2          glass
5   Yellow  9   B2          toilet
6   White   4   B3          wardrobe
7   Black   2   B3          towel
8   Yellow  9   B3          room

Объединить в Df_2

Затем вам просто нужно объединить Df_1_final с Df_2, используя объединить , выбрав нужные столбцы

final_df = Df_2.merge(Df_1_final, left_on=['Name'], right_on=['type']).loc[:, ['A', 'Name', 'C', 'Description']]

Что дает в точности то же самое, что и Df_3

final_df

    A       Name      C     Description
0   White   lamp      4     large
1   White   bed       4     small
2   White   wardrobe  4     loud
3   Black   sink      2     weak
4   Black   glass     2     loyal
5   Black   towel     2     loyal
6   Yellow  kitchen   9     loud
7   Yellow  toilet    9     large
8   Yellow  room      9     small
0 голосов
/ 06 февраля 2019

Возможно, кто-то знает более эффективный способ, но вы можете просто перебрать его и использовать цикл.

temp_list = []

for index,row in Df_1.iterrows():
    for e in row['B']:
        temp_list.append((row['A'],row['C'],e))

temp_df = pd.DataFrame(temp_list,columns = ['A','C','B'])

Df_3 = Df_2.merge(temp_df, left_on = 'Name',right_on = 'B')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...