gpt4 book ai didi

python - 为什么 Pandas 会在 NaN 上合并?

转载 作者:IT老高 更新时间:2023-10-28 21:14:11 25 4
gpt4 key购买 nike

我最近问了一个关于 pandas 中缺失值的问题 here并被定向到 github issue .在阅读了该页面和 missing data documentation .

我想知道为什么 mergejoin当“它们不比较相等”时,将 NaN 视为匹配: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 ?

基本上,正如我上面所问的,为什么 mergejoin匹配 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)。

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

关于python - 为什么 Pandas 会在 NaN 上合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53688988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com