将数据帧中的所有列移到极端,替换所有的nan

时间:2015-04-08 18:34:47

标签: python pandas

我需要将以下数据框中的所有单个列移到最终端。 shift函数中是否有任何切换来执行此操作?

df = pd.DataFrame([[11,22,33,44,55], [nan,44,55], [nan,33,44,55], [11,22]]).T

输入

11  NaN NaN 11
22  44  33  22
33  55  44  NaN
44  NaN 55  NaN
55  NaN NaN NaN

输出

11  NaN NaN NaN
22  NaN NaN NaN
33  NaN 33  NaN
44  44  44  11
55  55  55  22

编辑:我看到的方式是所有列都是独立的,需要区别对待。在按下时,一旦我得到非NAN值,我需要停止。

我试图通过首先将数据帧转换为列表列表然后插入nans,然后转换回数据帧来实现此目的。

2 个答案:

答案 0 :(得分:1)

你可以遍历每个col,得到最后一个有效值的索引位置,然后按df的长度减去这个索引位置,因为索引是0,你需要偏移1:

In [33]:

for col in df: 
    idx = df.loc[df[col].notnull(),col].index[-1]
    df[col] = df[col].shift(len(df) - (idx + 1))
df
Out[33]:
    0   1   2   3
0  11 NaN NaN NaN
1  22 NaN NaN NaN
2  33 NaN  33 NaN
3  44  44  44  11
4  55  55  55  22

答案 1 :(得分:0)

此解决方案附加了包含任何NaN的数据帧部分和不包含任何NaN的部分。

df = pd.DataFrame([[11,22,33,44,55], [np.nan,44,55], [np.nan,33,44,55], [11,22]]).T

>>> pd.concat([df.loc[df.isnull().T.any()], df.loc[df.notnull().T.all()]])
    0   1   2   3
0  11 NaN NaN  11
2  33  55  44 NaN
3  44 NaN  55 NaN
4  55 NaN NaN NaN
1  22  44  33  22

由于您的列是独立的,因此以下各项应单独排序,然后连接结果:

df2 = []
for c in df:
    s = df[c].copy()
    s.sort(inplace=True, na_position='first')
    df2.append(s)
result = pd.DataFrame([c.values for c in df2]).T

>>> result
    0   1   2   3
0  11 NaN NaN NaN
1  22 NaN NaN NaN
2  33 NaN  33 NaN
3  44  44  44  11
4  55  55  55  22