python - 为什么熊猫会在 NaN 上合并?
问题描述
我最近在这里问了一个关于 pandas 中缺失值的问题,并被定向到了一个github 问题。通读该页面和缺失的数据文档后。
我想知道为什么当“它们不比较相等”时将 NaN 视为匹配项merge
:join
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()]
但我很好奇为什么 NaN 被排除在一些 pandas 操作中groupby
,比如merge
, join
,update
和map
?
本质上,正如我上面所问的,为什么当它们比较不相等时merge
和join
匹配?np.nan
解决方案
是的,这绝对是一个错误。请参阅GH22491准确记录您的问题,以及GH22618指出问题也可以通过None
. 根据讨论,这似乎不是预期的行为。
快速的来源潜水表明问题 *可能*_factorize_keys
在pandas/core/reshape/merge.py
. 此函数似乎对键进行因式分解以确定要相互匹配的行。
具体来说,这部分
# NA group
lmask = llab == -1
lany = lmask.any()
rmask = rlab == -1
rany = rmask.any()
if lany or rany:
if lany:
np.putmask(llab, lmask, count)
if rany:
np.putmask(rlab, rmask, count)
count += 1
...似乎是罪魁祸首。NaN 键被标识为有效类别(类别值等于count
)。
免责声明:我不是熊猫开发者,这只是我的猜测;所以真正的问题可能是别的。但乍一看,似乎是这样。
推荐阅读
- python - 如何在窗口中保留 tkinter 画布?
- pip - PyPI 为什么我需要 pip --upgrade 两次?
- flutter - build 方法多久调用一次?
- python - 如何限制范围内的用户输入?
- python - 如何在 tensorboard 中显示 Tensorflow 2.0 中的 tf.data.Dataset.map 子图?
- python - 调整 LSTM 自动编码器性能
- android - 是否需要 setContentView() 来为片段充气?
- javascript - 我应该将哪个 FileystemDirectory 用于临时文件?
- javascript - 更改 ReactJs 中的对象状态值给我一个警告(不要直接改变状态。使用 setState()
- javascript - 使用express在Node.js中成功后如何发送JSON响应并重定向到某个html页面?