代码之家  ›  专栏  ›  技术社区  ›  Matt W.

把nan放在groubpy中,并转换mean

  •  0
  • Matt W.  · 技术社区  · 7 年前

    我想把A组 dataframe 并保持 nan 在他们身上 小精灵 .所以我用 fillna("") 是的。

    然后我取数字列 l ,我想取这个组的平均值。我遇到了一个错误 Could not convert "" to numeric 是的。它这么做是因为 列有一些 价值观。

    理想情况下,在groupby之后,我希望将那些now“”值转换回 所以我可以完成 .mean() 计算

    我所做的工作是先将分组依据的列转换为“”,然后执行 .平均值() ,然后将“”值返回到 完成后。有更好的办法吗?

    import random
    random.seed(100)
    
    df = pd.DataFrame({
    'a':[random.randint(0, 1) for x in range(1000)],
    'b':[random.randint(0, 1) for x in range(1000)],
    'c':[random.choice([0, 1, np.nan]) for x in range(1000)],
    'd':[random.randint(0, 1) for x in range(1000)],
    'e':[random.choice([0, 1, np.nan]) for x in range(1000)],
    'f':[random.choice(['id', 'id2']) for x in range(1000)],
    'g':[random.choice(['apple', 'orange', 'pear']) for x in range(1000)],
    'h':[random.randint(0, 1) for x in range(1000)],
    'i':[random.randint(0, 1) for x in range(1000)],
    'j':[random.randint(0, 1) for x in range(1000)],
    'k':[random.randint(0, 1) for x in range(1000)],
    'l':[random.choice([1, 2, 34, 6, 36, 990, np.nan, np.nan, 6, 5, 3, 2, 1, 1, 1]) for x in range(1000)]
    })
    
    
    df['mean_l'] = df.fillna("").groupby(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'])['l'].transform(lambda x: x.mean())
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Anton vBR    7 年前

    我们需要避免在 l 本例中的列,因为它是您的目标列。

    一种方法是重新分配列 分配。

    df['mean_l'] = (df.fillna('')
                      .assign(l=df.l)
                      .groupby(list('abcdefghijk'))['l']
                      .transform('mean'))