如何在Python数据框中查找不共享公共日期(或索引)的行

时间:2019-02-10 17:34:09

标签: python pandas dataframe set

我有两个熊猫数据框,每个数据框都有一个日期列。我需要找到没有共同日期的行

假设我在日期列上创建了索引,那么有找到行with common index like this的解决方案 但是我找不到任何没有常见日期的行的优雅解决方案。 例如 df1

                      values 1

28/11/2000          -0.055276
29/11/2000           0.027427
30/11/2000           0.066009
01/12/2000           0.012749
04/12/2000           0.113892

df2

                       values 2

24/11/2000            -0.004808
27/11/2000            -0.001812
28/11/2000            -0.026316
29/11/2000             0.015222
30/11/2000            -0.024480

给出两个数据框:一个包含df1中没有共同日期的行

df11

                     value 1

01/12/2000           0.012749
04/12/2000           0.113892

另一个包含df2中没有公共日期的行 df22

                       value 2
24/11/2000            -0.004808
27/11/2000            -0.001812

如果可以减少步数,我也可以使用其他任何格式的输出,例如将两个数据帧都输出到一个数据帧中。

有一些解决方案可以找到彼此不相等的行like this,但是该行的每个元素必须相同。

任何人都可以帮助您找到一个优雅的解决方案。 谢谢您的投入

3 个答案:

答案 0 :(得分:2)

如果不重新编制索引,我将从每个df中获取唯一的日期,然后使用这些日期对其他日期进行屏蔽。像

df1 = df1[~df1['date'].isin(df2['date'].unique())]
df2 = df2[~df2['date'].isin(df1['date'].unique())]

答案 1 :(得分:1)

使用Index.difference

df11 = df1.loc[df1.index.difference(df2.index)]
print (df11)
            values 1
01/12/2000  0.012749
04/12/2000  0.113892

df22 = df2.loc[df2.index.difference(df1.index)]
print (df22)
            values 2
24/11/2000 -0.004808
27/11/2000 -0.001812

带有numpy.setdiff1d的Numpy解决方案:

df11 = df1.loc[np.setdiff1d(df1.index, df2.index)]
df22 = df2.loc[np.setdiff1d(df2.index, df1.index)]

答案 2 :(得分:1)

merge使用indicator

s=df1.merge(df2,left_index=True,right_index=True,indicator=True,how='outer')
df1_1=s.loc[s['_merge']=='left_only',['values1']]
df2_2=s.loc[s['_merge']=='right_only',['values2']]
df1_1
             values1
01/12/2000  0.012749
04/12/2000  0.113892
df2_2
             values2
24/11/2000 -0.004808
27/11/2000 -0.001812