返回A列的所有值并将它们放在B列中,直到达到特定值

时间:2017-09-18 13:59:48

标签: python pandas numpy

我仍然遇到麻烦,似乎没有什么对我有用。我有一个包含两列的数据框。我试图在新列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'])

7 个答案:

答案 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