假设我们的数据框设置如下:
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移动正确的,但col6并col7保持原样NaN?我怎么能覆盖NaN的col6和col7值与col4和col5的价值观?这是一个错误还是打算?
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)
这可能是一个错误,您可以使用np.roll以下方法来实现:
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\nRun Code Online (Sandbox Code Playgroud)\n\nnp.rollSpeedwise,构造 df 并重用现有列并将结果作为数据参数传递给构造函数可能会更快DataFrame:
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\nRun Code Online (Sandbox Code Playgroud)\n\n时间安排
\n\nIn[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\nRun Code Online (Sandbox Code Playgroud)\n\n因此,用 的结果构造一个新的 dfnp.roll比先填充NaN值、转换为int,然后进行shifting 更快。
| 归档时间: |
|
| 查看次数: |
1356 次 |
| 最近记录: |