为什么执行 GroupBy 后会丢失数据?

ale*_*r09 2 python data-analysis python-3.x pandas

所以这个数据集有 200 万条患者记录。我被要求将每个变量二分,这部分已经完成,但任何患者都可以有多个记录,所以我必须按患者对它们进行分组。当我执行此操作时,我会丢失数据;知道为什么吗?这并不是在每个领域都会发生:

在此输入图像描述

我添加示例数据帧的图像来执行 groupby('npaciente),然后您可以看到,对于 value_ counts 中的每一列,它不会在 complicacionescronicas 列中返回任何内容

在此输入图像描述

jez*_*ael 5

我认为聚合后出现问题,max你得到所有NaNs,所以value_counts返回空Series

df = pd.DataFrame({'A':[1,1,0,np.nan],
                   'npatience':[np.nan,np.nan,4,5],
                   'C':[1,0,np.nan,np.nan],
                   'D':[1,3,5,7]})

print (df)
     A    C  D  npatience
0  1.0  1.0  1        NaN
1  1.0  0.0  3        NaN
2  0.0  NaN  5        4.0
3  NaN  NaN  7        5.0

print (df.A.value_counts())
1.0    2
0.0    1
Name: A, dtype: int64

print (df.C.value_counts())
0.0    1
1.0    1
Name: C, dtype: int64
Run Code Online (Sandbox Code Playgroud)
g = df.groupby('npatience').max()
print (g)
             A   C  D
npatience            
4.0        0.0 NaN  5
5.0        NaN NaN  7
Run Code Online (Sandbox Code Playgroud)
print (g.C)
npatience
4.0   NaN
5.0   NaN
Name: C, dtype: float64

#check if in column are all values NaNs
print (g.C.isnull().all())
True

print (g.A)
npatience
4.0    0.0
5.0    NaN
Name: A, dtype: float64


print (g.C.value_counts())
Series([], Name: C, dtype: int64)

print (g.A.value_counts())
0.0    1
Name: A, dtype: int64
Run Code Online (Sandbox Code Playgroud)
print (g.C.value_counts(dropna=False))
NaN    2
Name: C, dtype: int64

print (g.A.value_counts(dropna=False))
NaN     1
 0.0    1
Name: A, dtype: int64
Run Code Online (Sandbox Code Playgroud)

编辑:

groupby默认情况下删除s 行(不能按 NaN 分组),因此与之前的NaN调用相同:dropgroupby

g = df.dropna(subset=['npatience'])
print (g)
             A   C  D
npatience            
4.0        0.0 NaN  5
5.0        NaN NaN  7

print (g.C)
2   NaN
3   NaN
Name: C, dtype: float64

#check if in column are all values NaNs
print (g.C.isnull().all())
True
Run Code Online (Sandbox Code Playgroud)

不删除NaNs 的 groupby 的解决方案是将NaNs 替换为值(不在 中df),如下所示1000

g = df.fillna(1000).groupby('npatience').max()
print (g)
                A       C  D
npatience                   
4.0           0.0  1000.0  5
5.0        1000.0  1000.0  7
1000.0        1.0     1.0  3

print (g.C.value_counts())
1000.0    2
1.0       1
Name: C, dtype: int64
Run Code Online (Sandbox Code Playgroud)