web-dev-qa-db-fra.com

pandas tableau croisé dynamique renommer les colonnes

Comment renommer des colonnes à plusieurs niveaux après une opération de pivotement pandas?

Voici du code pour générer des données de test:

import pandas as pd
df = pd.DataFrame({
    'c0': ['A','A','B','C'],
    'c01': ['A','A1','B','C'],
    'c02': ['b','b','d','c'],
    'v1': [1, 3,4,5],
    'v2': [1, 3,4,5]})

print(df)

donne une trame de données de test:

   c0 c01 c02  v1  v2
0  A   A   b   1   1
1  A  A1   b   3   3
2  B   B   d   4   4
3  C   C   c   5   5

application du pivot

df2 = pd.pivot_table(df, index=["c0"], columns=["c01","c02"], values=["v1","v2"])
df2 = df2.reset_index()

donne

output1

comment renommer les colonnes en rejoignant les niveaux? au format <c01 value>_<c02 value>_<v1>

par exemple, la première colonne doit ressembler à "A_b_v1"

L'ordre de rejoindre les niveaux n'est pas vraiment important pour moi.

8
muon

Si vous souhaitez fusionner le multi-index en un index de chaîne unique sans vous soucier de l'ordre des niveaux d'index, vous pouvez simplement map une fonction join sur les colonnes et attribuer la liste des résultats:

df2.columns = list(map("_".join, df2.columns))

Et pour votre question, vous pouvez parcourir les colonnes où chaque élément est un tuple, décompresser le tuple et les rejoindre dans l'ordre que vous souhaitez:

df2 = pd.pivot_table(df, index=["c0"], columns=["c01","c02"], values=["v1","v2"])

# Use the list comprehension to make a list of new column names and assign it back
# to the DataFrame columns attribute.
df2.columns = ["_".join((j,k,i)) for i,j,k in df2.columns]
df2.reset_index()

enter image description here

12
Psidom