pandas df上的python函数使用多列和重置变量

时间:2017-05-19 23:20:35

标签: python function pandas lambda

请问在python / pandas中执行以下操作的最佳方法是什么?

我想计算趋势数据2与趋势数据1不一致的出现次数,并在每次趋势数据1改变时重置计数器。

我正在努力以正确的方式在数据框架上创建一个新列df['D']

df['A'] =趋势数据1
 如果趋势数据1改变,则df['B'] =布尔指示符  df['C'] =趋势数据2
 df['D'] =期望的结果

df['A']        df['B']        df['C']        df['D']            
  1                0              1            0
  1                0              1            0
 -1                1             -1            0
 -1                0             -1            0
 -1                0              1            1
 -1                0             -1            1
 -1                0             -1            1
 -1                0              1            2 
 -1                0              1            2
 -1                0             -1            2
  1                1              1            0
  1                0              1            0
  1                0             -1            1
  1                0              1            1
  1                0             -1            2
  1                0              1            2
  1                0              1            2
在Excel中

我只会使用:

=IF(B2=1,0,IF(AND((C2<>C1),(C2<>A2)),D1+1,D1))
然而,我一直都在努力无法引用大熊猫中的先前细胞。

我无法使用np.where()。我确定它只是以正确的方式应用函数,但我似乎无法使其工作引用其他列并重置变量。我已经查看了其他答案,但在这种情况下似乎找不到任何工作。

类似

  • 注意:创建df['E'] = df['C'].shift(1)

def corrections(x):

    if df['B'] == 1:    
        x = 0
    elif ((df['C'] != df['E']) AND ( df['C'] != df['A'])):
        x = x + 1
    else:
        x
道歉,因为我觉得我错过了一些相当简单的问题,但只是继续围成一圈!

2 个答案:

答案 0 :(得分:0)

def make_D (df):

    counter = 0

    array = []

    for index in df.index:

        if df.loc[index, 'A']!=df.loc[index, 'C']:

           counter = counter + 1

        if index>0:

            if df.loc[index, 'B'] != df.loc[index-1, 'B']:

                 counter = 0

        array.append(counter)

    df['D'] = array

    return (df)
new_df = make_D(df)
希望它有所帮助!

答案 1 :(得分:0)

#Set a list to store values for column D
d = []

#calculate D using the given conditions
df.apply(lambda x: d.append(0) if ((x.name==0)|(x.B==1)) else d.append(d[-1]+1) if (x.C!=df.iloc[x.name-1].C) & (x.C!=x.A) else d.append(d[-1]), axis=1)

#set columns D using values from the list d.
df['D'] = d

Out[594]: 
    A  B  C  D
0   1  0  1  0
1   1  0  1  0
2  -1  1 -1  0
3  -1  0 -1  0
4  -1  0  1  1
5  -1  0 -1  1
6  -1  0 -1  1
7  -1  0  1  2
8  -1  0  1  2
9  -1  0 -1  2
10  1  1  1  0
11  1  0  1  0
12  1  0 -1  1
13  1  0  1  1
14  1  0 -1  2
15  1  0  1  2
16  1  0  1  2