比较不同熊猫数据框中的列

时间:2018-08-31 16:33:31

标签: python pandas dataframe

我有两个数据框,一个具有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的{​​{1}},2000-01-02的{​​{1}}列的'A')。从那时起,我需要返回2000-01-04,如果它们相同,则返回'B'。我从合并开始,这给了我

True

我已经找到了如何找到共同的日期,但是对于如何进行相同/不同的比较却心存疑虑。谁能帮我比较具有共同价值的那几列?字典是一种有用的输出格式,但并不是必须的:

False

非常感谢。

3 个答案:

答案 0 :(得分:7)

假设Date列是索引。

  1. 默认情况下,堆栈会掉落
  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()

答案 1 :(得分:6)

检查eq中的isnulluser3483203数据

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

答案 2 :(得分:4)

fillnaeq一起使用

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}})