大熊猫转移行NaNs

A H*_*A H 5 python pandas

假设我们的数据框设置如下:

x = pd.DataFrame(np.random.randint(1, 10, 30).reshape(5,6),
                 columns=[f'col{i}' for i in range(6)])
x['col6'] = np.nan
x['col7'] = np.nan

    col0    col1    col2    col3    col4    col5    col6    col7
 0   6       5        1       5       2       4      NaN    NaN
 1   8       8        9       6       7       2      NaN    NaN
 2   8       3        9       6       6       6      NaN    NaN
 3   8       4        4       4       8       9      NaN    NaN
 4   5       3        4       3       8       7      NaN    NaN     
Run Code Online (Sandbox Code Playgroud)

拨打电话时x.shift(2, axis=1),col2 -> col5移动正确的,但col6col7保持原样NaN?我怎么能覆盖NaNcol6col7值与col4col5的价值观?这是一个错误还是打算?

    col0    col1    col2    col3    col4    col5    col6    col7
0   NaN      NaN    6.0     5.0     1.0      5.0    NaN     NaN
1   NaN      NaN    8.0     8.0     9.0      6.0    NaN     NaN
2   NaN      NaN    8.0     3.0     9.0      6.0    NaN     NaN
3   NaN      NaN    8.0     4.0     4.0      4.0    NaN     NaN
4   NaN      NaN    5.0     3.0     4.0      3.0    NaN     NaN
Run Code Online (Sandbox Code Playgroud)

EdC*_*ica 4

这可能是一个错误,您可以使用np.roll以下方法来实现:

\n\n
In[11]:\nx.apply(lambda x: np.roll(x, 2), axis=1)\n\nOut[11]: \n   col0  col1  col2  col3  col4  col5  col6  col7\n0   NaN   NaN   6.0   5.0   1.0   5.0   2.0   4.0\n1   NaN   NaN   8.0   8.0   9.0   6.0   7.0   2.0\n2   NaN   NaN   8.0   3.0   9.0   6.0   6.0   6.0\n3   NaN   NaN   8.0   4.0   4.0   4.0   8.0   9.0\n4   NaN   NaN   5.0   3.0   4.0   3.0   8.0   7.0\n
Run Code Online (Sandbox Code Playgroud)\n\n

np.rollSpeedwise,构造 df 并重用现有列并将结果作为数据参数传递给构造函数可能会更快DataFrame

\n\n
In[12]:\nx = pd.DataFrame(np.roll(x, 2, axis=1), columns = x.columns)\nx\n\nOut[12]: \n   col0  col1  col2  col3  col4  col5  col6  col7\n0   NaN   NaN   6.0   5.0   1.0   5.0   2.0   4.0\n1   NaN   NaN   8.0   8.0   9.0   6.0   7.0   2.0\n2   NaN   NaN   8.0   3.0   9.0   6.0   6.0   6.0\n3   NaN   NaN   8.0   4.0   4.0   4.0   8.0   9.0\n4   NaN   NaN   5.0   3.0   4.0   3.0   8.0   7.0\n
Run Code Online (Sandbox Code Playgroud)\n\n

时间安排

\n\n
In[13]:\n\n%timeit pd.DataFrame(np.roll(x, 2, axis=1), columns = x.columns)\n%timeit x.fillna(0).astype(int).shift(2, axis=1)\n\n10000 loops, best of 3: 117 \xc2\xb5s per loop\n1000 loops, best of 3: 418 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,用 的结果构造一个新的 dfnp.roll比先填充NaN值、转换为int,然后进行shifting 更快。

\n