<p>您可以使用:</p>
<pre><code>#if necessary
#df = df.set_index('Index')
df = df.apply(lambda x: pd.Series(x.dropna().values), axis=1).iloc[:, :4]
print (df)
0 1 2 3
Index
1991-12-31 100.000 100.000 100.000 89.123
1992-01-31 98.300 101.530 100.000 92.342
1992-02-29 100.230 98.713 97.602 NaN
1992-03-31 102.060 93.473 98.123 NaN
1992-04-30 102.205 107.755 94.529 94.529
</code></pre>
<p>或者为了获得更好的性能,请使用<code>numpy</code>-处理需求,每行至少有4个非值:</p>
^{pr2}$
<p><strong>计时</strong>:</p>
<pre><code> Index Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8
0 1991-12-31 100.0 100.000 100.000 89.123 NaN NaN NaN NaN
1 1992-01-31 98.3 101.530 100.000 NaN 92.342 NaN NaN NaN
2 1992-02-29 NaN 100.230 98.713 97.602 NaN NaN NaN 1.0
3 1992-03-31 NaN NaN 102.060 93.473 98.123 NaN NaN 1.0
4 1992-04-30 NaN 102.205 107.755 94.529 94.529 NaN NaN NaN
df = df.set_index('Index')
df = pd.concat([df] * 10000, ignore_index=1)
In [260]: %timeit pd.DataFrame(justify(df.values, invalid_val=np.nan, axis=1, side='left')[:,:4])
100 loops, best of 3: 6.78 ms per loop
In [261]: %%timeit a = df.values
...: pd.DataFrame(a[~np.isnan(a)].reshape(a.shape[0],-1)[:, :4], index=df.index)
...:
100 loops, best of 3: 2.11 ms per loop
In [262]: %timeit pd.DataFrame(np.sort(df.values, axis=1)[:, :4], columns=np.arange(1, 5)).add_prefix('Col')
100 loops, best of 3: 5.28 ms per loop
In [263]: %timeit pd.DataFrame(mask_app(df.values)[:,:4])
100 loops, best of 3: 8.68 ms per loop
</code></pre>