我仍然遇到麻烦,似乎没有什么对我有用。我有一个包含两列的数据框。我试图在新列B中返回A列中的所有值。但是,我想循环遍历A列并停止返回这些值,而当累积总和达到8或下一个值将使其返回时返回0大于8。
df max_val = 8
A
1
2
2
3
4
5
1
输出应该看起来像这样
df max_val = 8
A B
1 1
2 2
2 2
3 3
4 0
5 0
1 0
我觉得这样的事情
def func(x):
if df['A'].cumsum() <= max_val:
return x
else:
return 0
这不起作用:
df['B'] = df['A'].apply(func, axis =1 )
这两个都没有:
df['B'] = func(df['A'])
答案 0 :(得分:2)
您可以使用Series.where
:
df['B'] = df['A'].where(df['A'].cumsum() <= max_val, 0)
print (df)
A B
0 1 1
1 2 2
2 2 2
3 3 3
4 4 0
5 5 0
6 1 0
答案 1 :(得分:1)
方法#1 使用np.where
-
df['B']= np.where((df.A.cumsum()<=max_val), df.A ,0)
示例输出 -
In [145]: df
Out[145]:
A B
0 1 1
1 2 2
2 2 2
3 3 3
4 4 0
5 5 0
6 1 0
方法#2 另一个使用array-initialization
-
def app2(df,max_val):
a = df.A.values
colB = np.zeros(df.shape[0],dtype=a.dtype)
idx = np.searchsorted(a.cumsum(),max_val, 'right')
colB[:idx] = a[:idx]
df['B'] = colB
运行时测试
似乎@jezrael's pd.where
based one似乎很接近,所以在更大的数据集上对其进行计时 -
In [293]: df = pd.DataFrame({'A':np.random.randint(0,9,(1000000))})
In [294]: max_val = 1000000
# @jezrael's soln
In [295]: %timeit df['B1'] = df['A'].where(df['A'].cumsum() <= max_val, 0)
100 loops, best of 3: 8.22 ms per loop
# Proposed in this post
In [296]: %timeit df['B2']= np.where((df.A.cumsum()<=max_val), df.A ,0)
100 loops, best of 3: 6.45 ms per loop
# Proposed in this post
In [297]: %timeit app2(df, max_val)
100 loops, best of 3: 4.47 ms per loop
答案 2 :(得分:1)
df['B']=[x if x<=8 else 0 for x in df['A'].cumsum()]
df
Out[7]:
A B
0 1 1
1 2 3
2 2 5
3 3 8
4 4 0
5 5 0
6 1 0
答案 3 :(得分:0)
为什么不向这样的变量添加值:
for i in range(len(df)):
if A<max_val:
return x
else:
return 0
A=A+df[i]
答案 4 :(得分:0)
分成多行
import pandas as pd
A=[1,2,2,3,4,5,1]
MAXVAL=8
df=pd.DataFrame(data=A,columns=['A'])
df['cumsumA']=df['A'].cumsum()
df['B']=df['cumsumA']*(df['cumsumA']<MAXVAL).astype(int)
然后您可以放弃&#39; cumsumA&#39;柱
答案 5 :(得分:0)
以下内容可以正常使用 -
import numpy as np
max_val = 8
df['B'] = np.where(df['A'].cumsum() <= max_val , df['A'],0)
我希望这会有所帮助。
答案 6 :(得分:0)
只需使用.loc
:
df['c'] = df['a'].cumsum()
df['b'] = df['a']
df['b'].loc[df['c'] > 8] = 0