在python中如何合并两个数据帧而不丢失任何行

在python中如何合并两个数据帧而不丢失任何行,python,python-2.7,python-3.x,pandas,Python,Python 2.7,Python 3.x,Pandas,我有两个数据帧,如下所示 df1: df2: 输出: Student_Name,jan,feb X,350,400 Y,380,350 A,360,0 B,370,0 Y,380,350 输出应该有来自df2的行数和来自df1的值。如果在df1中找不到df2行标签,则应该有0。同样,如果df2索引列有重复项。例如,这里Y是两次,两次我们都从df1中取它的值。此外,输出不应有不在df2中但在df1中的行。这里D和E在df1中,但不在df2中,所以不包括在输出数据帧中

我有两个数据帧,如下所示

df1:

df2:

输出:

Student_Name,jan,feb
X,350,400               
Y,380,350
A,360,0
B,370,0
Y,380,350
输出应该有来自df2的行数和来自df1的值。如果在df1中找不到df2行标签,则应该有0。同样,如果df2索引列有重复项。例如,这里Y是两次,两次我们都从df1中取它的值。此外,输出不应有不在df2中但在df1中的行。这里D和E在df1中,但不在df2中,所以不包括在输出数据帧中。

您可以使用以下方法:

或:

如果只需要联接一列,则使用
.map()
方法可能会更快:

In [47]: df2['new'] = df2.Student_Name.map(df1.set_index('Student_Name')['total']) \
                         .fillna(0).astype(int)

In [48]: df2
Out[48]:
  Student_Name  jan  new
0            X  350  400
1            Y  380  350
2            A  360    0
3            B  370    0
4            Y  380  350

feb是列标签和值,取自df1。值得注意的是:这可能会非常慢(与典型的pandas操作相比),而且类型会发生有趣的事情,因为填充值必须是浮点。@pvg,感谢您的评论。我添加了另一种解决方案-与
merge()
相比,它应该更快,还可以检查重复的密钥。重复可能会导致大的风险problems@AsheKetchum,IMO为了能够处理复制品-我们首先应该知道OP想用它们做什么…@MaxU这是一个很好的观点。:)我只是想对pandas提供的
merge()
函数的性质进行评论。
Student_Name,jan,feb
X,350,400               
Y,380,350
A,360,0
B,370,0
Y,380,350
In [38]: pd.merge(df1, df2, on='Student_Name', how='left').fillna(0)
Out[38]:
  Student_Name  total    jan
0            X    400  350.0
1            Y    350  380.0
2            Y    350  380.0
3            D    450    0.0
4            E    420    0.0
In [39]: pd.merge(df1, df2, on='Student_Name', how='right').fillna(0)
Out[39]:
  Student_Name  total  jan
0            X  400.0  350
1            Y  350.0  380
2            Y  350.0  380
3            A    0.0  360
4            B    0.0  370
In [47]: df2['new'] = df2.Student_Name.map(df1.set_index('Student_Name')['total']) \
                         .fillna(0).astype(int)

In [48]: df2
Out[48]:
  Student_Name  jan  new
0            X  350  400
1            Y  380  350
2            A  360    0
3            B  370    0
4            Y  380  350