Chr*_*ris 17 python python-3.x pandas
我最近在这里问了一个关于大熊猫遗失值的问题,并且是针对github问题的.阅读完该页面和缺少的数据文档.
我想知道为什么merge并且join当"他们不比较平等"时将NaNs视为匹配: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
Run Code Online (Sandbox Code Playgroud)
但是,NaNs groupby排除在外:
df = pd.DataFrame({'col1':[np.nan, 'match', np.nan], 'col2':[1,2,1]})
df.groupby('col1').sum()
col2
col1
match 2
Run Code Online (Sandbox Code Playgroud)
当然你也可以dropna()或者df[df['col1'].notnull()]不过我很好奇,为什么NaN是排除像一些熊猫的操作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
Run Code Online (Sandbox Code Playgroud)
...似乎是罪魁祸首。NaN键被标识为有效类别(分类值等于count)。
免责声明:我不是熊猫开发者,这仅仅是我的猜测;因此真正的问题可能是其他问题。但是乍看之下,似乎是这样。
| 归档时间: |
|
| 查看次数: |
622 次 |
| 最近记录: |