Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么执行GroupBy后会丢失数据?_Python_Python 3.x_Pandas_Data Analysis - Fatal编程技术网

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

Python 为什么执行GroupBy后会丢失数据?,python,python-3.x,pandas,data-analysis,Python,Python 3.x,Pandas,Data Analysis,所以这个数据集有200万患者的记录。我被要求对每个变量进行二分法,这一部分已经完成,但任何患者都可以有多个记录,因此我必须根据患者对其进行分组。当我执行此操作时,我会丢失数据;知道为什么吗?并非每个领域都会发生这种情况: 我添加了一个示例数据帧的图像以执行groupby('npaciente'),然后您可以看到,对于valu_uuCounts中的每一列,它不会返回ConfacioneScronicas列中的任何内容 当然,在进行聚合时会丢失数据(groupby+max)-这很正常 演示: 聚合

所以这个数据集有200万患者的记录。我被要求对每个变量进行二分法,这一部分已经完成,但任何患者都可以有多个记录,因此我必须根据患者对其进行分组。当我执行此操作时,我会丢失数据;知道为什么吗?并非每个领域都会发生这种情况:

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


当然,在进行聚合时会丢失数据(
groupby
+
max
)-这很正常

演示:

聚合后:

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,因此返回空的
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



编辑:

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

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解决方案是用值替换
NaN
s(不在
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

什么返回值
print(g.head())
?您是否知道默认情况下
value\u counts()
不会报告
NaN
s?print(g.head())的超大值为169列,但对于我显示的前5行的2列,它们都是NaN,是的,我知道value\u counts默认情况下不会报告NaNs,但正如你在图像中看到的,它们并不是完全充满了NaN,我在聚合时丢失了数据,有什么想法吗?是的,数据应该更少,但我丢失了数据,在图像中的共谋犯罪中,假设有0或1,我得到了NaN,据我所知,NaN在数字上不大于0或1事实上,文档中说,在执行聚合时,NaN值被排除在外,因此max agg应该返回一些值,而不是空值series@alex,你能提供一个小的可复制的数据集吗?我不知道怎么做that@alex,请阅读并相应编辑您的帖子。是的,在聚合函数之后,complacioinescronicas系列都是空的,但我不知道为什么,因为在聚合之前,它有一些值,这就是我试图解决的问题。是的,存在数据问题-对于
nPartience
中的NaN,只有一些数据,另一个是NaN。因此,如果groupby,NAN行将被删除并获取所有
NAN
。groupby do
df=df.dropna('npatience').groupby('npatience').max()
,所以丢失了数据。我有解决方案,给我一些时间:)
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
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
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