如何在2列上加入Pandas DataFrame?

时间:2019-06-30 08:02:04

标签: python pandas

假设以下数据框

df1:

id    data1
1     10
2     200
3     3000
4     40000

df2:

id1    id2    data2
1      2      210
1      3      3010
1      4      40010
2      3      3200
2      4      40200
3      4      43000

我想要新的df3:

id1    id2    data2    data11    data12        
1      2      210      10        200
1      3      3010     10        3000
1      4      40010    10        40000 
2      3      3200     200       3000
2      4      40200    200       40000
3      4      43000    3000      40000

在熊猫中实现这一目标的正确方法是什么?


编辑:请注意,特定数据不能是任意的。我选择此特定数据只是为了显示一切来自何处,但是每个数据元素都与任何其他数据元素都没有关联。


其他数据框示例,因为第一个不够清晰:

df4:

id    data1
1     a
2     b
3     c
4     d

df5:

id1    id2    data2
1      2      e
1      3      f
1      4      g
2      3      h
2      4      i
3      4      j

我想要新的df6:

id1    id2    data2    data11    data12        
1      2      e        a         b  
1      3      f        a         c
1      4      g        a         d
2      3      h        b         c
2      4      i        b         d
3      4      j        c         d

Edit2: Data11和Data12只是data1的副本,其ID为id1id2

5 个答案:

答案 0 :(得分:4)

1。首先使用id1和id列合并两个数据框
2.将data1重命名为data11
3.删除ID列
4.现在,将id2和id上的df1和df3合并

df3 = pd.merge(df2,df1,left_on=['id1'],right_on=['id'],how='left')
df3.rename(columns={'data1':'data11'},inplace=True)
df3.drop('id',axis=1,inplace=True)

df3 = pd.merge(d3,df1,left_on=['id2'],right_on=['id'],how='left')
df3.rename(columns={'data1':'data12'},inplace=True)
df3.drop('id',axis=1,inplace=True)

我希望它能解决您的问题

答案 1 :(得分:2)

尝试一下:

# merge dataframes, first on id and id1 then on id2
df3 = pd.merge(df1, df2, left_on="id", right_on="id1", how="inner")
df3 = pd.merge(df1, df3, left_on="id", right_on="id2", how="inner")

# rename and reorder columns
cols = [ 'id1', 'id2', 'data2', 'data1_y', 'data1_x']
df3 = df3[cols]

new_cols = ["id1", "id2", "data2", "data11", "data12"]
df3.columns = new_cols

df3.sort_values("id1", inplace=True)

print(df3)

打印输出:

    id1 id2 data2   data11  data12
0   1   2   210     10      200
1   1   3   3010    10      3000
2   1   4   40010   10      40000
3   2   3   3200    200     3000
4   2   4   40200   200     40000
5   3   4   43000   3000    40000

答案 2 :(得分:2)

解决问题的方法之一是:

data1 = {'id' : [1,2,3,4],
         'data1' : [10,200,3000,40000]}

data2 = {'id1' : [1,1,1,2,2,3],
         'id2' : [2,3,4,3,4,4],
         'data2' : [210,3010,40010,3200,40200,43000]}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

df1:
id    data1
1     10
2     200
3     3000
4     40000

df2:
id1    id2    data2
1      2      210
1      3      3010
1      4      40010
2      3      3200
2      4      40200
3      4      43000

df3 = df2.set_index('id1').join(df1.set_index('id'))
df3.index.names = ['id1']
df3.reset_index(inplace=True)

final = df3.set_index('id2').join(df1.set_index('id'), rsuffix='2')
final.index.names = ['id2']
final.reset_index(inplace=True)

final[['id1','id2','data2','data1','data12']].sort_values('id1')

output df: 

id1 id2 data2   data1   data12
 1   2    210    10     200
 1   3    3010   10     3000
 1   4    40010  10     40000
 2   3    3200   200    3000
 2   4    40200  200    40000
 3   4    43000  3000   40000

我希望这会对您有所帮助。

答案 3 :(得分:2)

mergerange的for循环中使用f-string

我们可以对此进行概括并使其在具有两个以上数据帧时更易于扩展的一种方法是使用list comprehension和一个range的for循环。

此后,我们删除重复的列名称:

dfs = [df2.merge(df1, 
                 left_on=f'id{x+1}', 
                 right_on='id', 
                 how='left').rename(columns={'data1':f'data1{x+1}'}) for x in range(2)]

df = pd.concat(dfs, axis=1).drop('id', axis=1)

df = df.loc[:, ~df.columns.duplicated()]

输出

   id1  id2  data2  data11  data12
0    1    2    210      10     200
1    1    3   3010      10    3000
2    1    4  40010      10   40000
3    2    3   3200     200    3000
4    2    4  40200     200   40000
5    3    4  43000    3000   40000

答案 4 :(得分:0)

就像@tawab_shakeel前面提到的那样,您的第一步是根据某些(SQL)连接规则将数据框合并到特定的列上。只是为了让您了解在特定列上进行合并的不同方法,这里是一般指南。 enter image description here

Joining Dataframes in Pandas

enter image description here

SQL Join Types