使用 loc 和方括号比较元素明智地访问 pandas 列

accessing pandas columns with loc and square brackets comparison element wise

在一个特定的数据框中,我有一个名为 "Wind" 的列,它提供了德国每年的风能发电量。 在序列的开头,产生式非常小,在 DF 中写为 NaN,没有可用数据。只有从 2010 年开始,我才有风的数据。

DATA link 用于复制和粘贴: API_link_to_data='https://raw.githubusercontent.com/jenfly/opsd/master/opsd_germany_daily.csv'

energyDF = pd.read_csv(API_link_to_data)

现在以下代码比较两列元素:

energyDF.loc[:,'Wind'] == energyDF['Wind']

我预计结果是 [True, True, True,....,True]

但事实并非如此。 对于 NaN 值,结果为 False。

好吧,所有 NaN 值的结果都是假的,即使在元素方面它们是相同的:

print(wind_col1[0])
print(wind_col2[0])
print(wind_col1[0] == wind_col2[0])
print(wind_col1[0] == np.nan)
print(wind_col2[0] == np.nan)

结果: 楠 楠 错误的 错误的 假

预计: 楠 楠 真的 真的 真

在对整个框架进行处理后:

energyDF=energyDF.fillna(0)

然后

energyDF.loc[:,'Wind'] == energyDF['Wind']

是一个充满真值的列表。

有人可以解释一下吗?

谢谢

NaN不等于他们自己。参见:Why is NaN not equal to NaN?

至于检查 energyDF.loc[:,'Wind'] == energyDF['Wind']

的相等性

你可以 fillna 两边都有一个值(最好是系列中没有出现的值),然后检查两者是否确实相同

举个例子:

>>> df
    ID Col1
0  1.0   AD
1  NaN   BC
2  3.0   CE
>>> (df.loc[:, 'ID'] == df['ID']).all()
False
>>> (df.loc[:, 'ID'].fillna("Non-existent") == df['ID'].fillna("Non-existent")).all()
True