【发布时间】:2018-03-13 19:58:00
【问题描述】:
我很难找到一个优雅的解决方案来解决这个问题(可能没有)。
我有以下示例 DataFrame:
np.random.seed(0)
df = pd.DataFrame(np.random.randn(10,10)).abs()
0 1 2 3 4 5 6 \
0 1.764052 0.400157 0.978738 2.240893 1.867558 0.977278 0.950088
1 0.144044 1.454274 0.761038 0.121675 0.443863 0.333674 1.494079
2 2.552990 0.653619 0.864436 0.742165 2.269755 1.454366 0.045759
3 0.154947 0.378163 0.887786 1.980796 0.347912 0.156349 1.230291
4 1.048553 1.420018 1.706270 1.950775 0.509652 0.438074 1.252795
5 0.895467 0.386902 0.510805 1.180632 0.028182 0.428332 0.066517
6 0.672460 0.359553 0.813146 1.726283 0.177426 0.401781 1.630198
7 0.729091 0.128983 1.139401 1.234826 0.402342 0.684810 0.870797
8 1.165150 0.900826 0.465662 1.536244 1.488252 1.895889 1.178780
9 0.403177 1.222445 0.208275 0.976639 0.356366 0.706573 0.010500
7 8 9
0 0.151357 0.103219 0.410599
1 0.205158 0.313068 0.854096
2 0.187184 1.532779 1.469359
3 1.202380 0.387327 0.302303
4 0.777490 1.613898 0.212740
5 0.302472 0.634322 0.362741
6 0.462782 0.907298 0.051945
7 0.578850 0.311553 0.056165
8 0.179925 1.070753 1.054452
9 1.785870 0.126912 0.401989
我有以下区域地图:
zones = {“A”:[0,1,2],“B”:[3,4],“C”:[5,6,7,8],“D”:[9]}
这些区域向我显示我应该一起检查的列组,对于 df[columns] DataFrame 的每一 行,保留前 N 个项目(NB:保留行中的前 N 个项目,即横截面 - 见下文),将其余项目设置为零。例如对于 N=2 的区域“A”,我将检查以下 DataFrame:
0 1 2
0 1.764052 0.400157 0.978738
1 0.144044 1.454274 0.761038
2 2.552990 0.653619 0.864436
3 0.154947 0.378163 0.887786
4 1.048553 1.420018 1.706270
5 0.895467 0.386902 0.510805
6 0.672460 0.359553 0.813146
7 0.729091 0.128983 1.139401
8 1.165150 0.900826 0.465662
9 0.403177 1.222445 0.208275
因为 N=2 我会保留前 N 项:
0 1 2
0 1.764052 0. 0.978738
1 0. 1.454274 0.761038
2 2.552990 0. 0.864436
3 0. 0.378163 0.887786
4 0. 1.420018 1.706270
5 0.895467 0. 0.510805
6 0.672460 0. 0.813146
7 0.729091 0. 1.139401
8 1.165150 0.900826 0.
9 0.403177 1.222445 0.
上面区域图和 N=2 的整个输出将如下所示:
0 1 2 3 4 5 6 \
0 1.764052 0. 0.978738 2.240893 1.867558 0.977278 0.950088
1 0. 1.454274 0.761038 0.121675 0.443863 0.333674 1.494079
2 2.552990 0. 0.864436 0.742165 2.269755 1.454366 0.
3 0. 0.378163 0.887786 1.980796 0.347912 0. 1.230291
4 0. 1.420018 1.706270 1.950775 0.509652 0. 1.252795
5 0.895467 0. 0.510805 1.180632 0.028182 0.428332 0.
6 0.672460 0. 0.813146 1.726283 0.177426 0. 1.630198
7 0.729091 0. 1.139401 1.234826 0.402342 0.684810 0.870797
8 1.165150 0.900826 0. 1.536244 1.488252 1.895889 1.178780
9 0.403177 1.222445 0. 0.976639 0.356366 0.706573 0.
7 8 9
0 0. 0. 0.410599
1 0. 0. 0.854096
2 0. 1.532779 1.469359
3 1.202380 0. 0.302303
4 0. 1.613898 0.212740
5 0. 0.634322 0.362741
6 0. 0.907298 0.051945
7 0. 0. 0.056165
8 0. 0. 1.054452
9 1.785870 0. 0.401989
我试图解决这个问题的方式感觉有点慢。我遍历区域,然后得到 zone_df,然后遍历行,对每一行进行排序并调用 row.head(len(row) - N) 以获取需要设置为 0 的索引和列。然后使用这些值(在字典中)将 zone_df 中的单元格设置为零,然后合并 zone_dfs。
【问题讨论】:
-
您介意添加
np.random.seed(0)以便我们重现您的数据吗? -
会补充和修改
标签: python performance pandas numpy dataframe