我有一个包含很多列的大型数据框。我正在尝试编写一个 for 循环,它将在列之间进行一些简单的计算,但列必须是特定的,并且我根据数据框中的位置来识别它们。例如,我想在第8列和第1列之间、第8列和第7列之间进行计算,等等
创建要完成的操作列表并在 for 循环中调用该列表的最佳方法是什么?
到目前为止我已经有了这个(只是手动进行操作,重复了很多代码):
import numpy as np
import pandas as pd
data = [[99,3,12,4,63,55,67,32,15,102,87,34,82,102,99,30,99,1]]
cols_m = pd.MultiIndex.from_product([['1. FY21','2. FY22','3. FY23','4. FY24','5. FY25','6. FY26','7. FY27','8. FY28','9. FY29'],['Values','Sites']])
df = pd.DataFrame(data, columns = cols_m)
cols = df.columns.get_level_values(0).unique()
first_col = df.xs(cols[1], level=0, axis=1)
second_col = df.xs(cols[8], level=0, axis=1)
d = second_col - first_col
e = (second_col/first_col - 1) * 100
d = pd.concat({f"{cols[8]}-{cols[1]}": d}, axis=1)
e = pd.concat({f"{cols[8]}-{cols[1]} %Change": e}, axis=1)
df = pd.concat([df, d, e], axis=1)
del first_col, second_col, d, e
first_col = df.xs(cols[7], level=0, axis=1)
second_col = df.xs(cols[8], level=0, axis=1)
d = second_col - first_col
e = (second_col/first_col - 1) * 100
d = pd.concat({f"{cols[8]}-{cols[7]}": d}, axis=1)
e = pd.concat({f"{cols[8]}-{cols[7]} %Change": e}, axis=1)
df = pd.concat([df, d, e], axis=1)
and on and on, with different columns inserted...
我理想地希望有如下所示的内容(相同的输出),但我不确定如何创建列表:
list = {col[8] - col[1], col[8] - col[7]} #etc. etc.
all_dfs = []
for i, j in list:
first_col = df.xs(cols[i], level=0, axis=1)
second_col = df.xs(cols[j], level=0, axis=1)
d = second_col - first_col
e = (second_col/first_col - 1) * 100
d = pd.concat({f"{cols[j]}-{cols[i]}": d}, axis=1)
e = pd.concat({f"{cols[j]}-{cols[i]} %Change": e}, axis=1)
df = pd.concat([df, d, e], axis=1)
您可以使用元组列表:
pairs = [(8, 0), (8, 1)]
l = [df]
for i, j in pairs:
first_col = df.xs(cols[j], level=0, axis=1)
second_col = df.xs(cols[i], level=0, axis=1)
d = second_col - first_col
e = (second_col/first_col - 1) * 100
l.append(pd.concat({f"{cols[i]}-{cols[j]}": d,
f"{cols[i]}-{cols[j]} %Change": e},
axis=1)
)
out = pd.concat(l, axis=1)
输出:
1. FY21 2. FY22 3. FY23 4. FY24 5. FY25 6. FY26 7. FY27 8. FY28 9. FY29 9. FY29-2. FY22 9. FY29-2. FY22 %Change 9. FY29-1. FY21 9. FY29-1. FY21 %Change 9. FY29-2. FY22 9. FY29-2. FY22 %Change
Values Sites Values Sites Values Sites Values Sites Values Sites Values Sites Values Sites Values Sites Values Sites Values Sites Values Sites Values Sites Values Sites Values Sites Values Sites
0 99 3 12 4 63 55 67 32 15 102 87 34 82 102 99 30 99 1 87 -3 725.0 -75.0 0 -2 0.0 -66.666667 87 -3 725.0 -75.0