首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >具有NaN (缺少)值的pandas GroupBy列

具有NaN (缺少)值的pandas GroupBy列
EN

Stack Overflow用户
提问于 2013-08-25 21:28:41
回答 5查看 218.3K关注 0票数 211

我有一个在列中有许多缺失值的DataFrame,我希望按这些值进行分组:

代码语言:javascript
复制
import pandas as pd
import numpy as np
df = pd.DataFrame({'a': ['1', '2', '3'], 'b': ['4', np.NaN, '6']})

In [4]: df.groupby('b').groups
Out[4]: {'4': [0], '6': [2]}

可以看到Pandas已经删除了具有NaN目标值的行。(我想包括这些行!)

由于我需要许多这样的操作(许多cols缺少值),并且使用比中介(通常是随机森林)更复杂的函数,所以我希望避免编写太复杂的代码段。

有什么建议吗?我应该为此编写一个函数,还是有一个简单的解决方案?

EN

回答 5

Stack Overflow用户

发布于 2016-10-05 00:20:39

一个古老的话题,如果有人仍然对此感到困惑,另一个解决办法是在分组之前通过.astype(str)将其转换为字符串。这将保护南的。

代码语言:javascript
复制
df = pd.DataFrame({'a': ['1', '2', '3'], 'b': ['4', np.NaN, '6']})
df['b'] = df['b'].astype(str)
df.groupby(['b']).sum()
代码语言:javascript
复制
    a
b   
4   1
6   3
nan 2
票数 47
EN

Stack Overflow用户

发布于 2016-11-26 05:22:42

我无法向M. Kiewisch添加评论,因为我没有足够的名誉点(只有41个,但需要超过50个)。

考虑一下示例

代码语言:javascript
复制
>>> df = pd.DataFrame({'a': [1, 2, 3, 5], 'b': [4, np.NaN, 6, 4]})
>>> df
   a    b
0  1  4.0
1  2  NaN
2  3  6.0
3  5  4.0
>>> df.groupby(['b']).sum()
     a
b
4.0  6
6.0  3
>>> df.astype(str).groupby(['b']).sum()
      a
b
4.0  15
6.0   3
nan   2
票数 11
EN

Stack Overflow用户

发布于 2018-10-26 06:11:59

到目前为止提供的所有答案都会导致潜在的危险行为,因为您很有可能选择一个实际上是数据集一部分的虚拟值。当您创建具有许多属性的组时,出现这种情况的可能性越来越大。简而言之,这种方法并不总是能很好地推广。

一种不太麻烦的解决方案是使用pd.drop_duplicates()创建一个唯一的值组合索引,每个值组合都有自己的ID,然后对该id进行分组。它更冗长,但确实可以完成工作:

代码语言:javascript
复制
def safe_groupby(df, group_cols, agg_dict):
    # set name of group col to unique value
    group_id = 'group_id'
    while group_id in df.columns:
        group_id += 'x'
    # get final order of columns
    agg_col_order = (group_cols + list(agg_dict.keys()))
    # create unique index of grouped values
    group_idx = df[group_cols].drop_duplicates()
    group_idx[group_id] = np.arange(group_idx.shape[0])
    # merge unique index on dataframe
    df = df.merge(group_idx, on=group_cols)
    # group dataframe on group id and aggregate values
    df_agg = df.groupby(group_id, as_index=True)\
               .agg(agg_dict)
    # merge grouped value index to results of aggregation
    df_agg = group_idx.set_index(group_id).join(df_agg)
    # rename index
    df_agg.index.name = None
    # return reordered columns
    return df_agg[agg_col_order]

请注意,您现在可以简单地执行以下操作:

代码语言:javascript
复制
data_block = [np.tile([None, 'A'], 3),
              np.repeat(['B', 'C'], 3),
              [1] * (2 * 3)]

col_names = ['col_a', 'col_b', 'value']

test_df = pd.DataFrame(data_block, index=col_names).T

grouped_df = safe_groupby(test_df, ['col_a', 'col_b'],
                          OrderedDict([('value', 'sum')]))

这将返回成功的结果,而不必担心覆盖被误认为是虚拟值的真实数据。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18429491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档