在python中如何合并两个数据帧而不丢失任何行
我有两个数据帧,如下所示 df1: df2: 输出:在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中,所以不包括在输出数据帧中
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