我最近问了一个关于pandas here中缺失值的问题,并被定向到github issue . 通读该页面和missing data documentation后 .
我想知道 merge
和 join
为什么 merge
和 join
将NaNs视为匹配"they don't compare equal": np.nan != np.nan
# merge example
df = pd.DataFrame({'col1':[np.nan, 'match'], 'col2':[1,2]})
df2 = pd.DataFrame({'col1':[np.nan, 'no match'], 'col3':[3,4]})
pd.merge(df,df2, on='col1')
col1 col2 col3
0 NaN 1 3
# join example with same dataframes from above
df.set_index('col1').join(df2.set_index('col1'))
col2 col3
col1
NaN 1 3.0
match 2 NaN
但是, groupby
中的NaN排除在外:
df = pd.DataFrame({'col1':[np.nan, 'match', np.nan], 'col2':[1,2,1]})
df.groupby('col1').sum()
col2
col1
match 2
当然你可以 dropna()
或 df[df['col1'].notnull()]
但我很好奇为什么NaNs被排除在某些pandas操作中,如 groupby
而不是其他像 merge
, join
, update
和 map
?
基本上,正如我上面提到的,为什么 merge
和 join
匹配 np.nan
时它们不比较相等?
1 回答
是的,这绝对是个错误 . 请参阅GH22491,其中列出了您的问题,GH22618注意到
None
也出现了问题 . 根据讨论,这似乎不是预期的行为 .快速消息显示问题* might *位于
pandas/core/reshape/merge.py
的_factorize_keys函数内 . 此函数似乎将键分解以确定哪些行彼此匹配 .具体来说,这一部分
......似乎是罪魁祸首 . NaN键被标识为有效类别(分类值等于
count
) .免责声明:我不是大熊猫开发者,这只是我的猜测;所以真正的问题可能是别的 . 但从第一眼看,这似乎就是这样 .