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

时间:2017-08-02 07:32:23

标签: python python-3.x pandas data-analysis

因此,这个数据集有200万患者记录。我被要求将每个变量分成两部分,并且该部分已完成,但任何患者都可以有多个记录,因此我必须由患者对其进行分组。当我执行此操作时,我会丢失数据;任何想法为什么?这在每个领域都不会发生:

enter image description here

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

enter image description here

2 个答案:

答案 0 :(得分:2)

当你进行聚合(groupby + max)时,你正在丢失数据 - 这是正常的。

演示:

In [5]: df = pd.DataFrame(np.random.randint(0,5,(5,3)), columns=list('abc'))

In [6]: df
Out[6]:
   a  b  c
0  4  1  4
1  4  3  4
2  1  1  0
3  3  3  0
4  4  0  2

In [7]: df.b.value_counts()
Out[7]:
3    2
1    2
0    1
Name: b, dtype: int64

In [8]: df.c.value_counts()
Out[8]:
4    2
0    2
2    1
Name: c, dtype: int64
聚合后

In [9]: g = df.groupby('a').max()

In [10]: g
Out[10]:
   b  c
a
1  1  0
3  3  0
4  3  4

In [11]: g.b.value_counts()
Out[11]:
3    2
1    1
Name: b, dtype: int64

In [12]: g.c.value_counts()
Out[12]:
0    2
4    1
Name: c, dtype: int64

答案 1 :(得分:2)

我认为在汇总max后,您收到所有NaN后会出现问题,因此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
g = df.groupby('npatience').max()
print (g)
             A   C  D
npatience            
4.0        0.0 NaN  5
5.0        NaN NaN  7
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
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

编辑:

默认情况下,

groupby删除NaN行(不能按NaN分组),因此它与groupby之前的drop调用相同:

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

没有删除NaN的groupby解决方案会将NaN替换为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

{{1}}