连接两个表中相对多的对象

2024-05-29 01:43:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在第二张桌子上,我有九行。以及列“name”,其数据与列“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']
              })

Tags: 框架dataframedfsmallpdblacklargebed
2条回答

也许有人知道一个更有效的方法,但你可以用暴力来强迫它,然后使用一个循环

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

尝试以下方法:

爆炸Df\ U 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\ U 2中

然后您只需要使用merge,选择所需的列,将Df\u1\ufinal合并到Df\u2中

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

相关问题 更多 >

    热门问题