Acho que isso deve ser bem simples, mas estou com dificuldade para encontrar uma maneira fácil de fazer isso.
Tenho um DataFrame do Pandas com as colunas de A a D e preciso copiar algumas delas para novas colunas. O truque é que não envolve apenas renomear, mas também preciso duplicar os valores para novas colunas.
Aqui está um exemplo da entrada:
import pandas as pd
df = pd.DataFrame({
'A': [1,2,3],
'B':['2025-10-01', '2025-10-02', '2025-10-01'],
'C': ['2025-02-10', '2025-02-15', '2025-02-20'],
'D': [0, 5, 4],
'values': [52.3, 60, 70.6]
})
mapping_dict = {
'table_1': {
'id': 'A',
'dt_start': 'B',
'dt_end': 'B',
},
'table_2': {
'id': 'D',
'dt_start': 'C',
'dt_end': 'C',
},
}
Gostaria de ter como saída para table_1
um DataFrame o seguinte:
eu ia | dt_start | dt_end | valores |
---|---|---|---|
1 | 2025-10-01 | 2025-10-01 | 52,3 |
2 | 2025-10-02 | 2025-10-02 | 60 |
3 | 2025-10-01 | 2025-10-01 | 80,6 |
E acho que é possível inferir a saída esperada para table_2
.
Observe que a coluna values
, que não está incluída na lógica de mapeamento, deve permanecer no dataframe.
Consegui fazer isso usando um loop for, mas sinto que essa deveria ser uma maneira natural de fazer isso diretamente no pandas sem precisar executar um loop manual no dicionário de mapeamento e depois remover as colunas extras.
Aqui está minha solução até agora:
table_name = 'table_1'
new_df = df.copy()
for new_col, old_col in mapping_dict[table_name].items():
new_df[new_col] = df[old_col]
new_df = new_df.drop(mapping_dict[table_name].values(), axis='columns')
Qualquer ajuda ou sugestão será apreciada!
Se bem me lembro, você pode fazer isso com este comando. Esse é um dos motivos pelos quais gosto de usar o
set_axis
método em dataframes.Saída:
Ou,
Saída:
E, assim como @khushalvaland, você pode criar uma função para reutilização:
Saída:
e