将行移到左侧

时间:2017-07-12 05:25:14

标签: python pandas

我有一只熊猫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),但我绝对没有运气。

2 个答案:

答案 0 :(得分: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_axis(df.columns, 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

答案 1 :(得分:1)

对于每一行,使用列表推导仅保留非nan值并将其转换为Series。当系列组合时,熊猫将自动用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