比较不同pandas数据帧中的列

问题描述 投票:6回答:3

我有两个数据帧,一个是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 

我需要比较df1和df2中具有相同名称的列,这通常不会太复杂,但我需要从给定列的两个数据帧中可用数据的位置比较它们(例如来自df2) ,2000-01-02'A'2000-01-04'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

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

comparison_dict = {
    "A" : True,
    "B" : True,
    "C" : False
}

非常感谢。

python pandas dataframe
3个回答
7
投票

假设Date列是索引。

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

pd.Series.eq(*df1.stack().align(df2.stack(), 'inner')).groupby(level=1).all()

如果Date不是指数

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

6
投票

查看来自eqisnulluser3483203数据

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

4
投票

Using fillna with eq

df2.fillna(df1).eq(df1).all(0)

A        True
B        True
C       False
dtype: bool

这可以通过使用来自NaN的有效值填充df1值来实现,因此它们将始终相等,其中df2为null(基本上与忽略它们相同)。接下来,我们创建一个比较两个数组的布尔掩码:

df2.fillna(df1).eq(df1)

               A     B      C
2000-01-01  True  True   True
2000-01-02  True  True   True
2000-01-03  True  True   True
2000-01-04  True  True  False
2000-01-05  True  True  False

最后,我们断言每列的所有值都是True,以便将列视为相等。


建立

看起来你根据你想要的输出和合并为df1复制了错误的DataFrame,所以我从你的merge派生出来:

df1 = pd.DataFrame({'A': {'2000-01-01': 3.0, '2000-01-02': 5.0, '2000-01-03': 1.0, '2000-01-04': 2.0, '2000-01-05': 1.0}, 'B': {'2000-01-01': 4.0, '2000-01-02': 9.0, '2000-01-03': 6.0, '2000-01-04': 4.0, '2000-01-05': 3.0}, 'C': {'2000-01-01': 5.0, '2000-01-02': 2.0, '2000-01-03': 5.0, '2000-01-04': 1.0, '2000-01-05': 3.0}})

df2 = pd.DataFrame({'A': {'2000-01-01': np.nan, '2000-01-02': 5.0, '2000-01-03': 1.0, '2000-01-04': 2.0, '2000-01-05': 1.0}, 'B': {'2000-01-01': np.nan, '2000-01-02': np.nan, '2000-01-03': np.nan, '2000-01-04': 4.0, '2000-01-05': 3.0}, 'C': {'2000-01-01': np.nan, '2000-01-02': np.nan, '2000-01-03': 5.0, '2000-01-04': 8.0, '2000-01-05': 4.0}})
© www.soinside.com 2019 - 2024. All rights reserved.