将两个表相对于单元格中的许多对象串联起来

时间:2019-02-05 22:32:04

标签: python pandas numpy

两个表之间的连接有问题。更具体地说,我有第一个表(Df_1),该表具有列'B'和树行。在“ B”列的每一行中,我都有一个包含三个值的单元格(B列中的9个值位于三行中),确切地说,每个单元格都有一个包含三个值的数组。另外,我有两列具有单个值。

在第二张表中,我有九行。并且“名称”列中的数据与“ B”列中第一帧中的数据相同。但是在这里,它们是分开的,每行分别用于不同的行。

我假设我需要第一帧,将其更改为九行。就这些向量而言,我必须打破。然后将两个框架分别连接到第一个框架中的此新列和第二个框架中的“名称”列。

这是三行的第一帧:

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 :(得分:0)

也许有人知道一种更有效的方法,但是您可以蛮力地使用它并使用循环。

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

答案 1 :(得分:0)

尝试这种方法:

爆炸Df_1

使用concatmelt,在这种情况下非常有用

#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

然后,您只需要使用merge将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