使用特定列对的列表创建 for 循环

问题描述 投票:0回答:1

我有一个包含很多列的大型数据框。我正在尝试编写一个 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)

python pandas dataframe for-loop multi-index
1个回答
0
投票

您可以使用元组列表:

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
© www.soinside.com 2019 - 2024. All rights reserved.