我的数据帧:
A B C A_Q B_Q C_Q
27 40 41 2 1 etc
28 39 40 1 5
30 28 29 3 6
28 27 28 4 1
15 10 11 5 4
17 13 14 1 5
16 60 17 8 10
14 21 18 9 1
20 34 23 10 2
21 45 34 7 4
我想用_Q后缀迭代每列中的每一行,从A_Q开始并执行以下操作:
然后对其他列B_Q,C_Q等执行相同操作
因此,例如,在上面,出现的第一个“1”对应于col A中的28.所以x = 28.然后继续迭代,忽略值1到9,直到得到10,对应于col A中的20 。计算%change =((20/27)-1)* 100 = -25.9%并将其附加到新创建的col A_S中的df。然后从该点开始以相同的步骤继续,直到到达文件的末尾。最后,对其余列进行相同的操作。
那么df看起来像:
A B C A_Q B_Q C_Q A_S B_S C_S etc
27 40 41 2 1 etc
28 39 40 1 5
30 28 29 3 6
28 27 28 4 1
15 10 11 5 4
17 13 14 1 5
16 60 17 8 10 50
14 21 18 9 1
20 34 23 10 2 -25.9
21 45 34 7 4
我想创建一个函数,然后像df ['_S'] = df.apply ( function, axis =1)
那样做,但我坚持执行上面的步骤1-8。谢谢!
您是否需要将结果作为新列追加?你最终会得到几乎只有一个数据值的空列。你能将所有结果附加在'_Q'列的底部吗?无论如何这里是我的功能,你所做的一切:
def func(col1, col2):
l = []
x = None
for index in range(0, len(col1)):
if x is None and col1[index] == 1:
x = col2[index]
l.append(0)
elif not(x is None) and col1[index] == 10:
y = col2[index]
l.append(((float(y)/x)-1)*100)
x = None
else:
l.append(0)
return l
然后,您将此函数A_Q作为col1传递,将A作为col2传递,它应该返回您想要的。对于传递函数,假设每个A,B,C列都有一个关联的_Q列,您可以执行以下操作:
q = [col for col in df.columns if '_Q' in col]
for col in q:
df[col[:len(col) - 2] + '_S] = func(df[col], df[col[:len(col) - 2]