我的数据框:
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(对应于20)在col A中计算百分比变化=(((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。谢谢!
答案 0 :(得分:1)
是否需要将结果添加为新列?您将最终得到几乎只有一个数据值的空列。您能否将所有结果都附加在“ _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]