请问在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
道歉,因为我觉得我错过了一些相当简单的问题,但只是继续围成一圈!
答案 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