我有两个数据框,一个具有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
非常感谢。
答案 0 :(得分:7)
假设Date
列是索引。
'inner'
逻辑保持一致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
中的isnull
和user3483203
数据
((df1.eq(df2))|df2.isnull()|df1.isnull()).all(0)
Out[22]:
A True
B True
C False
dtype: bool
答案 2 :(得分:4)
fillna
与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}})