【问题标题】:Why am I losing data after I perform a GroupBy?为什么我在执行 GroupBy 后会丢失数据?
【发布时间】:2017-08-02 07:32:23
【问题描述】:

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

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

【问题讨论】:

  • 什么返回print (g.head())
  • 你知道value_counts()默认不报告NaNs吗?
  • print(g.head()) 它的超大,169 列,但是对于我显示的前 5 行都是 NaN 的那 2 个,是的,我知道 value_counts 不报告 NaN默认情况下,但是您可以在图像中看到它们并没有完全充满 NaN,而且我在聚合时丢失了这些数据,有什么想法吗?

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


【解决方案1】:

我认为在聚合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

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 默认删除 NaNs 行(不能按 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

不删除 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

【讨论】:

  • 是的,在聚合函数之后 complicacioinescronicas 系列都是空的,但我不知道为什么因为在聚合之前它有一些值,这就是我要修复的问题
  • 是的,存在数据问题——npatience 中的 NaN 只是一些数据,另一个是 NaN。所以如果 groupby,nans 行被删除并得到所有NaNs。 groupby do df = df.dropna('npatience').groupby('npatience').max(),所以丢失了数据。
  • 我有解决方案,给我一些时间:)
【解决方案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

【讨论】:

  • 是的,数据应该更少,但我正在丢失数据,假设图像中的复杂性为 0 或 1,我得到的是 NaN,据我所知, NaN 在数值上不大于 0 或 1
  • 事实上,文档说在执行聚合时,NaN 值被排除在外,因此 max agg 应该返回一些东西而不是空系列
  • @alex,您能否提供一个小的可重现数据集?
  • 我不知道该怎么做
  • @alex,请阅读how to make good reproducible pandas examples并相应地编辑您的帖子。
猜你喜欢
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多