【问题标题】:Shift rows to left向左移动行
【发布时间】:2021-06-07 12:54:18
【问题描述】:

我有一只熊猫 df:

   A   B  C
1 10   11 23
2 NaN  2  15
3 NaN  3  31
4 NaN NaN 56 

我想将行向左移动以在索引上对齐,如下所示:

  A   B   C
1 10  11  23
2 2   15  NaN
3 3   31  NaN
4 56  NaN NaN

我一直在尝试编写一个可以应用于 df 行的函数。我在想如果nan_counts = row.isnull().count() 我可以使用shift(-Nan_counts,axis=1),但我绝对没有运气。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    applyaxis=1 一起用于dropna 的行处理:

    df = df.apply(lambda x: pd.Series(x.dropna().values), 1)
    print (df)
          0     1     2
    1  10.0  11.0  23.0
    2   2.0  15.0   NaN
    3   3.0  31.0   NaN
    4  56.0   NaN   NaN
    

    对于列名(通用解决方案):

    print (df)
          A     B   C   D   E
    1  10.0  11.0  23 NaN NaN
    2   NaN   2.0  15 NaN NaN
    3   NaN   3.0  31 NaN NaN
    4   NaN   NaN  56 NaN NaN
    
    df1 = df.apply(lambda x: pd.Series(x.dropna().values), 1)
    df1.columns = df.columns[:len(df1.columns)]
    df1 = df1.reindex(df.columns, axis=1)
    print (df1)
          A     B     C   D   E
    1  10.0  11.0  23.0 NaN NaN
    2   2.0  15.0   NaN NaN NaN
    3   3.0  31.0   NaN NaN NaN
    4  56.0   NaN   NaN NaN NaN
    

    【讨论】:

    • 不错的解决方案。注意:“reindex_axis”已被弃用。请改用“重新索引”。
    【解决方案2】:

    对于每一行,使用列表推导仅保留非 nan 值并将其转换为系列。当 Serieses 合并时,Pandas 会自动用 nan 填充缺失值。

    df.apply(lambda x: pd.Series([e for e in x if pd.notnull(e)]), axis=1)
    Out[27]: 
          0     1     2
    1  10.0  11.0  23.0
    2   2.0  15.0   NaN
    3   3.0  31.0   NaN
    4  56.0   NaN   NaN
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 2018-06-11
      • 2012-11-20
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多