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