代码之家  ›  专栏  ›  技术社区  ›  jtlz2 naren8642

如何在删除空值的同时合并N个非数字列?

  •  3
  • jtlz2 naren8642  · 技术社区  · 6 年前

    Combining columns and removing NaNs Pandas ,

    我有这样一个数据帧:

    col     x       y        z
    
    a1      a       NaN      NaN
    a2      NaN     b        NaN
    a3      NaN     c        NaN
    a4      NaN     NaN      d
    a5      NaN     e        NaN
    a6      f       NaN      NaN
    a7      g       NaN      NaN
    a8      NaN     NaN      NaN
    

    单元格值是字符串,NaN是任意空值。

    我想合并这些列以添加一个新的合并列,因此:

    col  w
    
    a1   a
    a2   b
    a3   c
    a4   d
    a5   e
    a6   f
    a7   g
    a8   NaN
    

    df['w']=df[['x','y','z']].sum(axis=1)
    

    但sum不适用于非数值。

    你可以假设:

    1. 每行只有一个 x y , z 这是非空的。
    2. 必须按名称引用各个列(因为它们是dataframe中所有可用列的子集)。
    3. 希望不使用iloc/for循环:\

    更新:(向已经给出答案的人道歉:\)

    一如既往地感谢你的帮助

    3 回复  |  直到 6 年前
        1
  •  2
  •   sobek    6 年前

    这里还有另一个解决方案:

    df['res'] = df.fillna('').sum(1).replace('', np.nan)
    

    结果是

           x    y    z  res
    col                    
    a1     a  NaN  NaN    a
    a2   NaN    b  NaN    b
    a3   NaN    c  NaN    c
    a4   NaN  NaN    d    d
    a5   NaN    e  NaN    e
    a6     f  NaN  NaN    f
    a7     g  NaN  NaN    g
    a8   NaN  NaN  NaN  NaN
    
        2
  •  1
  •   Space Impact    6 年前

    我想你需要:

    s = df[['x','y','z']]
    df['w'] = s.values[s.notnull()]
    df[['col','w']]
    

    df['w'] = pd.DataFrame(df[['x','y','z']].apply(lambda x: x.values[x.notnull()],axis=1).tolist())
    df[['col','w']].fillna(np.nan)
    

    这给了

        col w
    0   a1  a
    1   a2  b
    2   a3  c
    3   a4  d
    4   a5  e
    5   a6  f
    6   a7  g
    7   a8  NaN
    
        3
  •  0
  •   pietroppeter    6 年前

    您必须应用自定义函数,而不是泛型求和。 举个例子,这一条适用于你的例子:

    import numpy as np
    f = lambda x: x[x.notnull()][0] if any(x.notnull()) else np.nan
    df['w'] = df[list('xyz')].apply(f, axis=1)