为什么我在执行 GroupBy 后会丢失数据?
Why am I losing data after I perform a GroupBy?
所以这个数据集有 200 万条患者记录。我被要求对每个变量进行二分法,这部分已经完成,但是任何患者都可以有多个记录,所以我必须按患者对它们进行分组。当我执行此操作时,我丢失了数据;知道为什么吗?这并不是在每个领域都会发生:
我正在添加示例数据帧的图像以执行 groupby('npaciente),然后您可以看到对于 valu_counts 中的每一列,它不会返回 complicacionescronicas 列中的任何内容
当然,您在进行聚合时会丢失数据 (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
我认为聚合 max
后有问题你得到所有 NaN
s,所以 value_counts
return 空 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
s 行(不能按 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
s 的 groupby 解决方案是用值(不在 df
中)替换 NaN
s,如 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
所以这个数据集有 200 万条患者记录。我被要求对每个变量进行二分法,这部分已经完成,但是任何患者都可以有多个记录,所以我必须按患者对它们进行分组。当我执行此操作时,我丢失了数据;知道为什么吗?这并不是在每个领域都会发生:
我正在添加示例数据帧的图像以执行 groupby('npaciente),然后您可以看到对于 valu_counts 中的每一列,它不会返回 complicacionescronicas 列中的任何内容
当然,您在进行聚合时会丢失数据 (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
我认为聚合 max
后有问题你得到所有 NaN
s,所以 value_counts
return 空 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
s 行(不能按 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
s 的 groupby 解决方案是用值(不在 df
中)替换 NaN
s,如 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