2017-06-14 23 views
1

我有一个熊猫数据框,我想检查每列,并且如果值曾经达到.92或更低,我希望将它之后的每个值都更改为1。一个简单的方法来完成这个?熊猫在特定值之后创建列1中的所有值

+0

你的问题还不清楚。你的意思是检查每列从上到下,如果一个值达到0.92或更低,你想要将该值(在该列中)之后的每个值都更改为1,那么是否在列内检查? –

+0

对不起,我应该写出来的框架,但我在手机上,这是一个痛苦...但基本上,如果列值是1.01,.98,.97,.92,.93,.91然后我想将列更改为1.01,.98,.97,.92,1,1.谢谢! – James

+0

列中是否还有一些模式。在你的例子中,我可以看到这些值按降序排列,或者只是一个巧合。 –

回答

2

考虑数据框df

np.random.seed([3,1415]) 
df = pd.DataFrame(np.random.rand(10, 10) * 10, columns=list('ABCDEFGHIJ')).round(2) 

使用cumprod一个布尔数据帧。然后使用在pd.DataFrame.where

df.where(df.gt(.92).cumprod().astype(bool), 1) 

     A  B C  D  E F  G  H  I  J 
0 4.45 4.08 4.6 4.65 4.63 1.0 8.50 8.18 7.78 7.58 
1 9.35 8.31 8.8 9.27 7.22 1.0 1.46 2.00 4.38 1.01 
2 2.79 6.10 1.0 8.37 7.40 1.0 6.91 3.77 2.25 4.35 
3 7.01 7.01 1.0 1.00 7.01 1.0 7.65 2.53 5.48 7.79 
4 6.52 1.36 1.0 1.00 2.75 1.0 7.14 7.76 5.42 8.37 
5 5.38 1.86 1.0 1.00 3.74 1.0 7.76 1.00 5.04 6.71 
6 6.20 3.02 1.0 1.00 3.68 1.0 8.82 1.00 4.96 8.06 
7 1.00 4.38 1.0 1.00 1.00 1.0 5.85 1.00 6.39 1.33 
8 1.00 8.82 1.0 1.00 1.00 1.0 1.00 1.00 6.06 4.02 
9 1.00 6.41 1.0 1.00 1.00 1.0 1.00 1.00 1.09 3.15 

一些关于我的解决办法困扰着我。所以我asked my own question here.。考虑到链接问题的建议,这是一个更好的解决方案。请考虑以下链接并表示对问题和答案的赞赏。谢谢。

v = df.values 
mask = np.logical_and.accumulate(v > .92, 0) 
pd.DataFrame(
    np.where(mask, v, 1), 
    df.index, df.columns 
) 

     A  B C  D  E F  G  H  I  J 
0 4.45 4.08 4.6 4.65 4.63 1.0 8.50 8.18 7.78 7.58 
1 9.35 8.31 8.8 9.27 7.22 1.0 1.46 2.00 4.38 1.01 
2 2.79 6.10 1.0 8.37 7.40 1.0 6.91 3.77 2.25 4.35 
3 7.01 7.01 1.0 1.00 7.01 1.0 7.65 2.53 5.48 7.79 
4 6.52 1.36 1.0 1.00 2.75 1.0 7.14 7.76 5.42 8.37 
5 5.38 1.86 1.0 1.00 3.74 1.0 7.76 1.00 5.04 6.71 
6 6.20 3.02 1.0 1.00 3.68 1.0 8.82 1.00 4.96 8.06 
7 1.00 4.38 1.0 1.00 1.00 1.0 5.85 1.00 6.39 1.33 
8 1.00 8.82 1.0 1.00 1.00 1.0 1.00 1.00 6.06 4.02 
9 1.00 6.41 1.0 1.00 1.00 1.0 1.00 1.00 1.09 3.15 

定时

%timeit df.where(df.gt(.92).cumprod().astype(bool), 1) 
1000 loops, best of 3: 844 µs per loop 

%%timeit 
v = df.values 
mask = np.logical_and.accumulate(v > .92, 0) 
pd.DataFrame(
    np.where(mask, v, 1), 
    df.index, df.columns 
) 
10000 loops, best of 3: 65.8 µs per loop 
+0

我从来没有听说过df.gt。那么在.gt调用之前,那个df中的所有1.00都是0.92还是更少? – James

+0

@詹姆斯我给你的代码重建相同的数据框。看看你自己,看看。 :-) – piRSquared

+0

好的谢谢!我会在决赛后的一段时间玩代码,并接受你的答案,如果它适合我​​的朋友! – James

相关问题