比较不同pandas数据帧中的列

poi*_*ter 6 python dataframe pandas

我有两个数据帧,一个是1990年开始的每日信息,另一个是2000年开始的每日信息.两个数据帧都包含2016年结束的信息.

df1:

   Date       A     B     C 
1990-01-01   3.0  40.0  70.0  
1990-01-02  20.0  50.0  80.0  
1990-01-03  30.0  60.0  90.0  
1990-01-04   2.0   1.0   1.0 
1990-01-05   1.0   8.0   3.0  

df2:

   Date       A     B     C 
2000-01-01   NaN   NaN   NaN  
2000-01-02   5.0   NaN   NaN  
2000-01-03   1.0   NaN   5.0  
2000-01-04   2.0   4.0   8.0 
2000-01-05   1.0   3.0   4.0 
Run Code Online (Sandbox Code Playgroud)

我需要比较df1和df2中具有相同名称的列,这通常不会太复杂,但我需要从给定列的两个数据帧中可用数据的位置比较它们(例如df2,2000-01-02在列中'A',2000-01-04in 'B'.True如果它们从那一点开始是相同的,False如果它们不同,我需要返回.我从合并开始,这给了我:

df2.merge(df1, how = 'left', on = 'Date')


   Date      A.x   B.x   C.x   A.y   B.y   C.y   
2000-01-01   NaN   NaN   NaN   3.0   4.0   5.0
2000-01-02   5.0   NaN   NaN   5.0   9.0   2.0
2000-01-03   1.0   NaN   5.0   1.0   6.0   5.0
2000-01-04   2.0   4.0   8.0   2.0   4.0   1.0
2000-01-05   1.0   3.0   4.0   1.0   3.0   3.0
Run Code Online (Sandbox Code Playgroud)

我已经找到了如何找到共同的日期,但我不知道如何进行相同/不同的比较.任何人都可以帮我比较有共同价值点的列吗?一本字典作为一种有用的输出格式浮现在脑海中,但并不重要:

comparison_dict = {
    "A" : True,
    "B" : True,
    "C" : False
}
Run Code Online (Sandbox Code Playgroud)

非常感谢.

piR*_*red 7

假设Date列是索引.

  1. 堆叠将默认下降为nan
  2. 'inner'逻辑对齐
  3. 检查平等
  4. 分组并检查所有 True

pd.Series.eq(*df1.stack().align(df2.stack(), 'inner')).groupby(level=1).all()
Run Code Online (Sandbox Code Playgroud)

如果Date不是索引

pd.Series.eq(
    *df1.set_index('Date').stack().align(
        df2.set_index('Date').stack(), 'inner'
    )
).groupby(level=1).all()
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 6

检查eqisnull数据来自user3483203

((df1.eq(df2))|df2.isnull()|df1.isnull()).all(0)
Out[22]: 
A     True
B     True
C    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)