在下面的片段中:
import pandas as pd
import numpy as np
df = pd.DataFrame(
{
"a": [1, 2, 3, 4, 5, 6, 7, 8, 9],
"b": [1, np.nan, 1, np.nan, 2, 1, 2, np.nan, 1]
}
)
df_again = df.groupby("b", dropna=False).apply(lambda x: x)
我原以为 df
和 df_again
是相同的。但他们不是:
df
a b
0 1 1.0
1 2 NaN
2 3 1.0
3 4 NaN
4 5 2.0
5 6 1.0
6 7 2.0
7 8 NaN
8 9 1.0
df_again
a b
0 1 1.0
2 3 1.0
4 5 2.0
5 6 1.0
6 7 2.0
8 9 1.0
现在,如果我稍微调整 lambda 表达式以“查看”发生了什么
df.groupby("b", dropna=False).apply(lambda x: print(x))
我实际上可以想象 df
的部分 code>b
为 NaN
已处理。
我在这里错过了什么? (使用 Pandas 1.3.1 和 numpy 1.20.3)
最佳答案
因为None
和None
是一回事:
>>> None == None
True
>>>
你必须使用np.nan
:
>>> np.NaN == np.NaN
False
>>>
那么试试这个:
df = pd.DataFrame(
{
"a": [1, 2, 3, 4, 5, 6, 7, 8, 9],
"b": [1, np.NaN, 1, np.NaN, 2, 1, 2, np.NaN, 1]
}
)
df_again = df.groupby("b", dropna=False).apply(lambda x: x)
现在 df
和 df_again
是一样的:
>>> df
a b
0 1 1.0
1 2 NaN
2 3 1.0
3 4 NaN
4 5 2.0
5 6 1.0
6 7 2.0
7 8 NaN
8 9 1.0
>>> df_again
a b
0 1 1.0
1 2 NaN
2 3 1.0
3 4 NaN
4 5 2.0
5 6 1.0
6 7 2.0
7 8 NaN
8 9 1.0
>>> df.equals(df_again)
True
>>>
关于python-3.x - 将 dropna 设置为 True 的 Pandas groupby 生成错误的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68918019/