熊猫-合并和比较两个DataFrame(一个唯一的列)

时间:2018-07-24 04:41:58

标签: python pandas dataframe

我知道这是一个普遍的问题,但是熊猫上的变化太多,以至于我找不到解决问题的方法。

我有两个DataFrames-一个用于today,一个用于yesterday,并且想要创建两个同时用作输入的新df。

基于我的唯一列-两个df之间的比较可以具有三个输出之一。

  1. 唯一键在todayyesterday
  2. 唯一键位于today中,而不是yesterday
  3. 唯一键不是today,而是在yesterday

我想合并第一个df,使其输出#1和#2,其中yesterday中的值优先,并添加来自yesterday的任何其他列。

第二个输出我只是想输出#3。

使用一些示例:

今天

index c1 c2 unique
1     x  y  14A
2     x  y  15A
4     x  y  17A
5     x  y  18A
6     x  y  19A

昨天

index c1 c2 unique c3
1     a  b  14A    z
2     a  b  15A    z
3     a  b  16A    z
4     a  b  17A    z

output1(#1&#2)

index c1 c2 unique c3
1     a  b  14A    z
2     a  b  15A    z
4     a  b  17A    z
5     x  y  18A
6     x  y  19A

output2(#3)

index c1 c2 unique c3
3     a  b  16A    z

一些额外的东西:

  • 我一直在尝试将pd.merge用于#1,我真的很希望合并时没有_x_y重复的列。
  • 我为#3尝试了yest[~yest['UniqueKey'].isin(today['UniqueKey'])],但我认为它可行吗?

非常感谢您的帮助。

谢谢。

3 个答案:

答案 0 :(得分:2)

对于输出3,您可以尝试:

DataFrame.join(other_Dataframe, how = 'right')

您可以关注:Pandas Documentation

答案 1 :(得分:2)

我对第一个要求(输出1和输出2)的解决方案

case1 = yesterday[yesterday['unique'].isin(today['unique'])] 

case2 = today[~today['unique'].isin(yesterday['unique'])]

output_1_2 = case1.append(case2, ignore_index = True)
output_1_2.replace(np.nan, "", regex = True) # to replace NaN

对于第二个需求(输出3),您的方法有效。

答案 2 :(得分:1)

输出1(#1&#2)可以使用pandas.DataFrame.combine_first

获得

如果尚未完成,请将unique列设置为数据框的索引

today = today.set_index('unique')
yesterday = yesterday.set_index('unique')

然后

yesterday[yesterday.index.isin(today.index)].combine_first(today).reset_index()
  unique c1 c2   c3  index
0    14A  a  b    z    1.0
1    15A  a  b    z    2.0
2    17A  a  b    z    4.0
3    18A  x  y  NaN    5.0
4    19A  x  y  NaN    6.0

输出2(#3)可以使用两个索引&.loc的集合差来获得,或者更好的是使用否定的isin和布尔索引

yesterday[~yesterday.index.isin(today.index)]
# or: yesterday.loc[list(set(yesterday.index) - set(today.index))]
# both produce the following output:
  unique  index c1 c2 c3
0    16A      3  a  b  z