最近,我问了一个关于Pandas here中缺失值的问题,并直接联系了github issue.读完那一页和missing data documentation页之后.

我想知道为什么mergejoin在"他们不相等"的情况下将南斯视为一对: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名中的非符合项不包括:

df = pd.DataFrame({'col1':[np.nan, 'match', np.nan], 'col2':[1,2,1]})
df.groupby('col1').sum()

       col2
col1    
match   2

当然,你可以 Select dropna()df[df['col1'].notnull()],但我很好奇,为什么在一些Pandas 行动中,比如groupby,而不是mergejoinupdatemap,会排除南部?

基本上,正如我在上面所问的,为什么mergejoin在不相等的情况下与np.nan匹配?

推荐答案

是的,这是一只虫子.请参阅GH22491哪些文件准确记录了您的问题,以及GH22618哪些注释None也观察到了问题.根据讨论,这似乎不是有意的行为.

快速查看源代码显示问题*might*在pandas/core/reshape/merge.py中的_factorize_keys函数内.此函数似乎可以分解键,以确定哪些行要相互匹配.

具体来说,这一部分

# 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).

免责声明:我不是Pandas 开发者,这只是我的猜测;所以真正的问题可能是别的.但乍一看,似乎是这样.

Python-3.x相关问答推荐

Python将类实例变量转换为嵌套 struct

如何从选定的html内容中获取所需的文本

十进制浮点数到整型的转换错误

给定panda代码的分组和百分比分布pyspark等价

我用Kivy创建的应用程序在安卓系统上运行时出错.(attributeerror:';class';对象没有属性';_javaclass__cls_storage';)

CDKTF ec2 具有特定私有 IP 地址的娱乐

在 string.find() 条件下加入两个 Dataframes

Pandas 在每组两个条件之间获得时间增量

Pandas matplotlib:条形图占总数的百分比

DynamoDB - boto3 - batch_write_item:提供的关键元素与架构不匹配

用于 BIG 数组计算的多处理池映射比预期的要慢

错误:预期语句,发现 py:Dedent

cv2 python 没有 imread 成员

如何调试垂死的 Jupyter Python3 内核?

Python 3 与 Python 2 映射行为

如何模拟 open(...).write() 而不会出现没有这样的文件或目录错误?

在 Ubuntu 上为 Python3 安装 mod_wsgi

为什么在 Python 3 中实例的 __dict__ 的大小要小得多?

Python3 - 如何从现有抽象类定义抽象子类?

将列表列表转换为Python中的字典字典