我有两个熊猫数据框,每个数据框都有一个日期列。我需要找到没有共同日期的行
假设我在日期列上创建了索引,那么有找到行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,但是该行的每个元素必须相同。
任何人都可以帮助您找到一个优雅的解决方案。 谢谢您的投入
答案 0 :(得分:2)
如果不重新编制索引,我将从每个df中获取唯一的日期,然后使用这些日期对其他日期进行屏蔽。像
df1 = df1[~df1['date'].isin(df2['date'].unique())]
df2 = df2[~df2['date'].isin(df1['date'].unique())]
答案 1 :(得分:1)
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