我需要将以下数据框中的所有单个列移到最终端。 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,然后转换回数据帧来实现此目的。
答案 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