当前位置: 首页 > 面试题库 >

如何在熊猫中使用分组模式替换缺失值?

徐飞尘
2023-03-14
问题内容

我按照该方法在这个职位跟团模式,以取代缺失值,但遇到“IndexError:索引越界”。

 df['SIC'] = df.groupby('CIK').SIC.apply(lambda x: x.fillna(x.mode()[0]))

我想这可能是因为某些组缺少所有值并且没有模式。有办法解决这个问题吗?谢谢!


问题答案:

mode鉴于确实没有任何商定的方式来处理关系,所以这非常困难。另外,它通常非常慢。这是一种“快速”的方法。我们将定义一个函数来计算每个组的模式,然后用来填充缺失的值map。我们不会遇到缺少组的问题,尽管对于关系,我们可以随意选择排序时首先出现的模式值:

def fast_mode(df, key_cols, value_col):
    """ 
    Calculate a column mode, by group, ignoring null values.

    Parameters
    ----------
    df : pandas.DataFrame
        DataFrame over which to calcualate the mode. 
    key_cols : list of str
        Columns to groupby for calculation of mode.
    value_col : str
        Column for which to calculate the mode.

    Return
    ------ 
    pandas.DataFrame
        One row for the mode of value_col per key_cols group. If ties, 
        returns the one which is sorted first. 
    """
    return (df.groupby(key_cols + [value_col]).size() 
              .to_frame('counts').reset_index() 
              .sort_values('counts', ascending=False) 
              .drop_duplicates(subset=key_cols)).drop(columns='counts')

样本数据df

   CIK  SIK
0    C  2.0
1    C  1.0
2    B  NaN
3    B  3.0
4    A  NaN
5    A  3.0
6    C  NaN
7    B  NaN
8    C  1.0
9    A  2.0
10   D  NaN
11   D  NaN
12   D  NaN

码:

df.loc[df.SIK.isnull(), 'SIK'] = df.CIK.map(fast_mode(df, ['CIK'], 'SIK').set_index('CIK').SIK)

输出df

   CIK  SIK
0    C  2.0
1    C  1.0
2    B  3.0
3    B  3.0
4    A  2.0
5    A  3.0
6    C  1.0
7    B  3.0
8    C  1.0
9    A  2.0
10   D  NaN
11   D  NaN
12   D  NaN


 类似资料:
  • 欢迎提供任何关于这个问题更准确标题的帮助。。 我有一个数据框,其中包含客户级别的观察结果,记录日期以及客户在该日期消费的物品。看起来像这样。 此数据集中的每个观察值都与一个独特的存储日组合有关,但每个存储日观察值都是以消耗的物品的正数为条件列出的,即

  • 问题内容: 我知道这个问题有很多主题,但是没有一种方法适合我,因此我将发布有关我的具体情况的信息 我有一个看起来像这样的数据框: 我想做的是将“性别”列中的全0替换为“女”,并将所有1替换为“男”,但是当我使用上面的代码时,数据框中的值似乎没有变化 我是否使用了replace()错误?还是有更好的方法进行条件值替换? 问题答案: 是的,您使用的是错误的,默认情况下不是就地操作,它会返回替换的数据框

  • 问题内容: 鉴于熊猫0.20.0的更新和弃用,我想知道用其余的和获得相同结果的最有效方法是什么。我只是回答了这个问题,但是第二种选择(不使用)似乎效率低下且冗长。 片段: 同时使用条件和索引位置过滤时,这是正确的方法吗? 问题答案: 通过用位置对特定索引进行切片来获得所需的索引值,您可以留在一个单一的世界中。

  • 问题内容: 给定以下数组,我想用点替换逗号: 我一直在尝试不同的方式,但是我不知道该怎么做。另外,我已将其作为DataFrame导入,但无法应用该函数: 有什么建议如何解决这个问题? 问题答案: 您需要分配的结果,你的工作早在操作不就地,除了可以使用或并用矢量化要做到这一点更快: 这里的关键是分配结果:

  • 问题内容: 我想在包含空格(任意数量)的Pandas数据框中找到所有值,并用NaN替换这些值。 有什么想法可以改善吗? 基本上我想把这个: 变成这个: 我已经用下面的代码做到了,但是这很丑。这不是Pythonic,而且我敢肯定,这也不是最有效的熊猫使用方式。我遍历每一列,并对通过应用对每个值进行正则表达式搜索的函数生成的列掩码进行布尔替换,在空白处进行匹配。 通过仅迭代可能包含空字符串的字段,可以

  • 我想找到熊猫数据框中包含空白(任意数量)的所有值,并用NaN替换这些值。 有什么想法可以改进吗? 基本上,我想把这个转变为: 为此: 我已经设法做到了下面的代码,但人是丑陋的。这不是蟒蛇,我肯定这也不是对熊猫最有效的利用。我循环遍历每一列,并对应用一个函数生成的列掩码进行布尔替换,该函数对每个值进行正则表达式搜索,并在空格上进行匹配。 只需遍历可能包含空字符串的字段,即可对其进行一点优化: 但这算