我有两个数据帧,一个是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
}
非常感谢。
假设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()
查看来自eq
的isnull
和user3483203
数据
((df1.eq(df2))|df2.isnull()|df1.isnull()).all(0)
Out[22]:
A True
B True
C False
dtype: bool
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}})