Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多列和重设变量的python函数_Python_Function_Pandas_Lambda - Fatal编程技术网

使用多列和重设变量的python函数

使用多列和重设变量的python函数,python,function,pandas,lambda,Python,Function,Pandas,Lambda,在python/pandas中执行以下操作的最佳方法是什么 我想计算趋势数据2与趋势数据1不一致的情况,并在每次趋势数据1发生变化时重置计数器 在本例中,我正在努力寻找在数据帧上创建一个新列df['D']的正确方法 df['A']=趋势数据1 df['B']=如果趋势数据1发生变化,则为布尔指标 df['C']=趋势数据2 df['D']=所需结果 df['A'] df['B'] df['C'] df['D'] 1

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

我想计算趋势数据2与趋势数据1不一致的情况,并在每次趋势数据1发生变化时重置计数器

在本例中,我正在努力寻找在数据帧上创建一个新列
df['D']
的正确方法

df['A']
=趋势数据1
df['B']
=如果趋势数据1发生变化,则为布尔指标
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))
抱歉,因为我觉得我在这个问题上遗漏了一些非常简单的东西,但请继续兜圈子

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)


希望有帮助

你能编辑你的问题来解释第一组2来自哪里吗?
#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
new_df = make_D(df)
#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