如何比较缺少值的Python Pandas中的两个DataFrame
介绍
熊猫使用NumPy NaN(np.nan)对象表示缺失值。这个Numpy NaN值具有一些有趣的数学性质。例如,它不等于自身。但是,与自身相比,Python None对象的评估结果为True。
怎么做..
让我们看一些示例来了解np.nan的行为。
import pandas as pdimport numpy as np
# Python None Object compared against self.
print(f"Output \n *** {None == None} ")
输出结果
*** True
# Numpy nan compared against self.print(f"Output \n *** {np.nan == np.nan} ")
输出结果
*** False
# Is nan > 10 or 1000 ?print(f"Output \n *** {np.nan > 10} ")
输出结果
*** False
传统上,Series和DataFrames使用equals运算符==进行比较。比较的结果是一个对象。首先让我们看看如何使用equals运算符。
# create a dataframe with tennis players and their grandslam titles.df = pd.DataFrame(data={"players": ['Federer', 'Nadal', 'Djokovic', 'Murray','Medvedev','Zverev'],
"titles": [20, 19, 17, 3,np.nan,np.nan]})
# set the index
df.index = df['players']
# sort the index in ascending
df.sort_index(inplace=True, ascending=True)
# check if the index is set
df.index.is_monotonic_increasing
# see records
print(f"Output \n{df}")
输出结果
players titlesplayers
Djokovic Djokovic 17.0
Federer Federer 20.0
Medvedev Medvedev NaN
Murray Murray 3.0
Nadal Nadal 19.0
Zverev Zverev NaN
1.为了更好地理解,我们将首先比较所有参与者与标量值“ Federer”,然后查看结果。
print(f'Output \n {df == "Federer"}')
输出结果
players titlesplayers
Djokovic False False
Federer True False
Medvedev False False
Murray False False
Nadal False False
Zverev False False
C:\Users\sasan\anaconda3\lib\site-packages\pandas\core\ops\array_ops.py:253: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparisonres_values = method(rvalues)
2.这可以按预期工作,但是每当您尝试比较具有缺失值的DataFrame时,就会出现问题。作为观察者,让我们将df与自身进行比较。
df_compare = df == dfprint(f'Output \n {df_compare}')
输出结果
players titlesplayers
Djokovic True True
Federer True True
Medvedev True False
Murray True True
Nadal True True
Zverev True False
3.乍一看,所有值似乎都像您期望的那样正确。但是,请使用.all方法查看每列是否仅包含True值(因为我们正在比较两个相似的对象,对吗?)会产生意外的结果。
print(f'Output \n {df_compare.all()}')
输出结果
players Truetitles False
dtype: bool
4.如前面的注释 ,发生这种情况是因为缺失值彼此之间的比较不同。看,我们清楚地知道medvedev和Zverev没有标题(即NaN),因此,如果我们在每列中添加缺失值的数量,则标题应为2,玩家应为0。让我们看看会发生什么。
print(f'Output \n {(df_compare == np.nan).sum()}')
输出结果
players 0titles 0
dtype: int64
5. Above的结果出乎意料,因为nan的行为截然不同。
6.比较两个完整的DataFrame的正确方法不是使用equals运算符(==),而是使用.equals方法。
此方法将相同位置的NaN视为相等。
重要注意事项.eq方法等效于== not .equals。
print(f'Output \n {df_compare.equals(df_compare)}')
输出结果
True
7.如果要在单元测试中尝试比较两个DataFrame,则还有另一种方法。如果两个DataFrame不相等,则assert_frame_equal函数将引发AssertionError。如果两个DataFrame相等,则返回None。
from pandas.testing import assert_frame_equalprint(f'Output \n {assert_frame_equal(df_compare, df_compare) is None}')
输出结果
True
以上是 如何比较缺少值的Python Pandas中的两个DataFrame 的全部内容, 来源链接: utcz.com/z/340780.html