Función para la operación de DataFrame usando variables en la lista con Python

Tengo una lista list = ['OUT', 'IN'] donde todos los elementos de la lista es un nombre de variable en el dataframe con sufijos _3M, _6M, _9M, 15M adjuntos.

Lista: list = ['OUT', 'IN']

Input_df:

ID OUT_3M OUT_6M OUT_9M OUT_15M IN_3M IN_6M IN_9M IN_15M A 2 3 4 6 2 3 4 6 B 3 3 5 7 3 3 5 7 C 2 3 6 6 2 3 6 6 D 3 3 7 7 3 3 7 7

El problema que estoy resolviendo es restar la

1. OUT_6M desde OUT_3M y entrando en una columna separada como Out_3M-6M

2. OUT_9M desde OUT_6M y entrando en una columna separada como Out_6M-9M

3. OUT_15M desde OUT_9M y entrar en una columna separada como Out_9M-15M

Lo mismo se repite para todos y cada uno de los elementos de la lista mientras se mantienen el OUT_3M y el IN_3M que mencioné en el conjunto de datos de muestra Output_df .

Output_df:

ID Out_3M Out_3M-6M Out_6M-9M Out_9M-15M IN_3M IN_3M-6M IN_6M-9M IN_9M-15M A 2 1 1 2 2 1 1 2 B 3 0 2 2 3 0 2 2 C 2 1 3 0 2 1 3 0 D 3 0 4 0 3 0 4 0

Hay muchos elementos en la lista que necesito para realizar la operación. ¿Hay alguna manera de que pueda resolver esto escribiendo una función. ¡Gracias!

No estoy seguro de lo que quiere decir al escribir una función, ¿no son suficientes para un ciclo lo que quiere hacer? Algo como:

 postfixes = ['3M','6M','9M','15M'] prefixes = ['IN','OUT'] # Allocate the space, while also copying _3M output_df = input_df.copy() # Rename a few output_df.rename(columns={'_'.join((prefix, postfixes[i])): '_'.join((prefix, postfixes[i-1] + '-' + postfixes[i])) for prefix in prefixes for i in range(1, len(postfixes))}, inplace=True) # Compute the differences for prefix in prefixes: for i in range(1,len(postfixes)): postfix = postfixes[i] + '-' + postfixes[i-1] output_df['_'.join((prefix, postfix))] = input_df['_'.join((prefix, postfixes[i-1]))].values - input_df['_'.join((prefix, postfixes[i]))].values 

El output_df es una copia de input_df al principio, tanto para evitar tratar el caso _3M por separado, como para pre-asignar el DataFrame en lugar de crear las columnas una a la vez (no importa en su código, pero si tenía miles de columnas que perdería tiempo moviendo cosas en la memoria de lo contrario …)

Además, debes evitar llamar a una lista “lista” o, de paso, tendrás algunos errores desagradables cuando intentes convertir una tupla en una lista.