例如,如何从中获取
a b c
0 1 2 3
1 4 5 6
至
a a->b b b->c c c->a
0 1 200% 2 150% 3 33%
1 4 125% 5 120% 6 66%
我试过类似的东西
df = pd.DataFrame(pd.np.arange(6).reshape(2, 3) + 1, columns=list("abc"))
for c1, c2 in [[0, 1], [1, 2], [2, 3]]:
df[f"{c1}/{c2}"] = 100 * df.iloc[:, c1] / df.iloc[:, c2]
以及重新排序列(因为这会在末尾附加所有新列(,但它超级不可读,看起来像Pandas反模式。
更新
我应该提到的是,依赖列名中的模式是不好的,因为没有模式,即它们没有编号/字母顺序等。
我们可以使用numpy
roll
df = df.join(pd.DataFrame(df.values/np.roll(df.values, -1, axis=1),
columns=df.columns + '/' + np.roll(df.columns,-1),
index=df.index))
Out[83]:
a b c a/b b/c c/a
0 1 2 3 0.5 0.666667 3.0
1 4 5 6 0.8 0.833333 1.5