2015-12-08 4 views
0

Je suis suivantPandas, Pivotant dataframe plusieurs colonnes hiérarchiques

https://nikolaygrozev.wordpress.com/2015/07/01/reshaping-in-pandas-pivot-pivot-table-stack-and-unstack-explained-with-pictures/

mais je suis face à un scénario différent pour faire pivoter DataFrames.

La commande de pivot de base est comme ceci:

d.pivot(index='Item', columns='CType', values='USD') 

Supposons maintenant mon 'Item', appartient à deux catégories, 'Area' et 'Region', dans deux autres colonnes de données. Je veux que le résultat pivoté contienne ces trois niveaux (Region, Area, Item). Comment puis je faire ça?

J'avais cherché des réponses partout, et avait essayé des méthodes comme 'unstack', 'droplevel', 'reset_index', etc., mais n'a pas pu les faire fonctionner moi-même.

Aidez-nous s'il vous plaît.

Merci

+3

Pourriez-vous publier des données en faisant d.head(). To_dict()? – WoodChopper

+0

Voici un [take] (http://blog.kyleblawlor.com/posts/tidy-data/) sur le type de pivot des opérations. Faites-moi savoir si c'est utile et j'écrirai une réponse. Tout le code source est au bas de la publication si vous voulez l'essayer. – wgwz

Répondre

1

d'abord, vous voulez probablement utiliser pd.pivot_table. Deuxièmement, lorsque vous souhaitez disposer de plusieurs colonnes le long d'une dimension, vous devez les transmettre sous forme de liste (par exemple, index=['Item', 'Area', 'Region']).

# Random data. 
np.random.seed(0) 
df = pd.DataFrame({'Area': ['A', 'A', 'A', 'B', 'B', 'B'], 
        'Region': ['r', 's', 'r', 's', 'r', 'r'], 
        'Item': ['car' ,'car', 'car', 'truck', 'bus', 'bus'], 
        'CType': [3, 4, 3, 3, 5, 5], 
        'USD': np.random.rand(6) * 100}) 

>>> df 
    Area CType Item Region  USD 
0 A  3 car  r 54.881350 
1 A  4 car  s 71.518937 
2 A  3 car  r 60.276338 
3 B  3 truck  s 54.488318 
4 B  5 bus  r 42.365480 
5 B  5 bus  r 64.589411 

>>> pd.pivot_table(df, 
        index=['Item', 'Area', 'Region'], 
        columns='CType', 
        values='USD', 
        aggfunc=sum) 

CType      3   4   5 
Item Area Region         
bus B r    NaN  NaN 106.954891 
car A r  115.157688  NaN   NaN 
      s    NaN 71.518937   NaN 
truck B s  54.488318  NaN   NaN 
+0

Ahah! 'pd.pivot_table' !!! Je poursuivais le long de la ligne 'd.pivot (['Item', 'Area', 'Region'], columns = 'CType', values ​​= 'USD')'. Pas étonnant que c'était si frustrant. Merci beaucoup! – xpt

+0

Oh, BTW, @Alexander, supposons que les trois niveaux hiérarchiques du plus grand au plus petit sont Region => Area => Item, alors l'ordre dans votre commande 'pivot_table' a été inversé. Mieux vaut le corriger pour quelqu'un d'autre à la recherche des réponses. Merci. – xpt