it-swarm.com.de

So schwenken Sie einen Datenrahmen

  • Was ist Pivot?
  • Wie schwenke ich?
  • Ist das ein Drehpunkt?
  • Langes Format zu breitem Format?

Ich habe viele Fragen zu Pivot-Tabellen gesehen. Auch wenn sie nicht wissen, dass sie nach Pivot-Tabellen fragen, sind sie es normalerweise. Es ist praktisch unmöglich, eine kanonische Frage und Antwort zu schreiben, die alle Aspekte des Schwenkens umfasst.

... Aber ich werde es versuchen.


Das Problem bei vorhandenen Fragen und Antworten besteht darin, dass sich die Frage häufig auf eine Nuance konzentriert, die das OP nur schwer verallgemeinern kann, um eine Reihe der vorhandenen guten Antworten zu verwenden. Keine der Antworten versucht jedoch, eine umfassende Erklärung abzugeben (da dies eine entmutigende Aufgabe ist).

Schauen Sie sich einige Beispiele aus meiner Google-Suche an

  1. Wie schwenke ich einen Datenrahmen in Pandas?
    • Gute Frage und Antwort. Die Antwort beantwortet jedoch nur die spezifische Frage mit wenig Erklärung.
  2. Pandas Pivot-Tabelle zum Datenrahmen
    • In dieser Frage befasst sich das OP mit der Ausgabe des Pivots. Nämlich wie die Spalten aussehen. OP wollte, dass es wie R aussieht. Dies ist nicht sehr hilfreich für pandas Benutzer.
  3. Pandas, die einen Datenrahmen schwenken, doppelte Zeilen
    • Eine andere anständige Frage, aber die Antwort konzentriert sich auf eine Methode, nämlich pd.DataFrame.pivot

Wenn also jemand nach pivot sucht, erhält er sporadische Ergebnisse, die seine spezifische Frage wahrscheinlich nicht beantworten werden.


Konfiguration

Möglicherweise stellen Sie fest, dass ich meine Spalten und die relevanten Spaltenwerte auffällig benannt habe, damit sie der Ausrichtung in den folgenden Antworten entsprechen. Achten Sie darauf, dass Sie wissen, wohin welche Spaltennamen führen, um die gewünschten Ergebnisse zu erhalten.

import numpy as np
import pandas as pd
from numpy.core.defchararray import add

np.random.seed([3,1415])
n = 20

cols = np.array(['key', 'row', 'item', 'col'])
arr1 = (np.random.randint(5, size=(n, 4)) // [2, 1, 2, 1]).astype(str)

df = pd.DataFrame(
    add(cols, arr1), columns=cols
).join(
    pd.DataFrame(np.random.Rand(n, 2).round(2)).add_prefix('val')
)
print(df)

     key   row   item   col  val0  val1
0   key0  row3  item1  col3  0.81  0.04
1   key1  row2  item1  col2  0.44  0.07
2   key1  row0  item1  col0  0.77  0.01
3   key0  row4  item0  col2  0.15  0.59
4   key1  row0  item2  col1  0.81  0.64
5   key1  row2  item2  col4  0.13  0.88
6   key2  row4  item1  col3  0.88  0.39
7   key1  row4  item1  col1  0.10  0.07
8   key1  row0  item2  col4  0.65  0.02
9   key1  row2  item0  col2  0.35  0.61
10  key2  row0  item2  col1  0.40  0.85
11  key2  row4  item1  col2  0.64  0.25
12  key0  row2  item2  col3  0.50  0.44
13  key0  row4  item1  col4  0.24  0.46
14  key1  row3  item2  col3  0.28  0.11
15  key0  row3  item1  col1  0.31  0.23
16  key0  row0  item2  col3  0.86  0.01
17  key0  row4  item0  col3  0.64  0.21
18  key2  row2  item2  col0  0.13  0.45
19  key0  row2  item0  col4  0.37  0.70

Fragen)

  1. Warum bekomme ich ValueError: Index contains duplicate entries, cannot reshape

  2. Wie schwenke ich df so, dass die col-Werte Spalten sind, row-Werte den Index und den Mittelwert von val0 sind die Werte?

    col   col0   col1   col2   col3  col4
    row                                  
    row0  0.77  0.605    NaN  0.860  0.65
    row2  0.13    NaN  0.395  0.500  0.25
    row3   NaN  0.310    NaN  0.545   NaN
    row4   NaN  0.100  0.395  0.760  0.24
    
  3. Wie schwenke ich df so, dass die col Werte Spalten sind, row Werte sind der Index, Mittelwert von val0 sind die Werte und fehlende Werte sind 0?

    col   col0   col1   col2   col3  col4
    row                                  
    row0  0.77  0.605  0.000  0.860  0.65
    row2  0.13  0.000  0.395  0.500  0.25
    row3  0.00  0.310  0.000  0.545  0.00
    row4  0.00  0.100  0.395  0.760  0.24
    
  4. Kann ich etwas anderes als mean bekommen, wie vielleicht sum?

    col   col0  col1  col2  col3  col4
    row                               
    row0  0.77  1.21  0.00  0.86  0.65
    row2  0.13  0.00  0.79  0.50  0.50
    row3  0.00  0.31  0.00  1.09  0.00
    row4  0.00  0.10  0.79  1.52  0.24
    
  5. Kann ich mehr als eine Aggregation gleichzeitig durchführen?

           sum                          mean                           
    col   col0  col1  col2  col3  col4  col0   col1   col2   col3  col4
    row                                                                
    row0  0.77  1.21  0.00  0.86  0.65  0.77  0.605  0.000  0.860  0.65
    row2  0.13  0.00  0.79  0.50  0.50  0.13  0.000  0.395  0.500  0.25
    row3  0.00  0.31  0.00  1.09  0.00  0.00  0.310  0.000  0.545  0.00
    row4  0.00  0.10  0.79  1.52  0.24  0.00  0.100  0.395  0.760  0.24
    
  6. Kann ich über mehrere Wertespalten aggregieren?

          val0                             val1                          
    col   col0   col1   col2   col3  col4  col0   col1  col2   col3  col4
    row                                                                  
    row0  0.77  0.605  0.000  0.860  0.65  0.01  0.745  0.00  0.010  0.02
    row2  0.13  0.000  0.395  0.500  0.25  0.45  0.000  0.34  0.440  0.79
    row3  0.00  0.310  0.000  0.545  0.00  0.00  0.230  0.00  0.075  0.00
    row4  0.00  0.100  0.395  0.760  0.24  0.00  0.070  0.42  0.300  0.46
    
  7. Kann durch mehrere Spalten unterteilt werden?

    item item0             item1                         item2                   
    col   col2  col3  col4  col0  col1  col2  col3  col4  col0   col1  col3  col4
    row                                                                          
    row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.605  0.86  0.65
    row2  0.35  0.00  0.37  0.00  0.00  0.44  0.00  0.00  0.13  0.000  0.50  0.13
    row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.000  0.28  0.00
    row4  0.15  0.64  0.00  0.00  0.10  0.64  0.88  0.24  0.00  0.000  0.00  0.00
    
  8. Oder

    item      item0             item1                         item2                  
    col        col2  col3  col4  col0  col1  col2  col3  col4  col0  col1  col3  col4
    key  row                                                                         
    key0 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.86  0.00
         row2  0.00  0.00  0.37  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.50  0.00
         row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.00  0.00  0.00
         row4  0.15  0.64  0.00  0.00  0.00  0.00  0.00  0.24  0.00  0.00  0.00  0.00
    key1 row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.81  0.00  0.65
         row2  0.35  0.00  0.00  0.00  0.00  0.44  0.00  0.00  0.00  0.00  0.00  0.13
         row3  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.28  0.00
         row4  0.00  0.00  0.00  0.00  0.10  0.00  0.00  0.00  0.00  0.00  0.00  0.00
    key2 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.40  0.00  0.00
         row2  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.13  0.00  0.00  0.00
         row4  0.00  0.00  0.00  0.00  0.00  0.64  0.88  0.00  0.00  0.00  0.00  0.00
    
  9. Kann ich die Häufigkeit, mit der die Spalten und Zeilen zusammen vorkommen, auch als "Kreuztabelle" bezeichnen?

    col   col0  col1  col2  col3  col4
    row                               
    row0     1     2     0     1     1
    row2     1     0     2     1     2
    row3     0     1     0     2     0
    row4     0     1     2     2     1
    
  10. Wie konvertiere ich einen DataFrame von lang nach breit, indem ich NUR zwei Spalten schwenke? Gegeben,

    np.random.seed([3, 1415])
    df2 = pd.DataFrame({'A': list('aaaabbbc'), 'B': np.random.choice(15, 8)})        
    df2        
       A   B
    0  a   0
    1  a  11
    2  a   2
    3  a  11
    4  b  10
    5  b  10
    6  b  14
    7  c   7
    

    Das erwartete sollte ungefähr so ​​aussehen

          a     b    c
    0   0.0  10.0  7.0
    1  11.0  10.0  NaN
    2   2.0  14.0  NaN
    3  11.0   NaN  NaN
    
  11. Wie kann ich den Mehrfachindex nach pivot auf einen einzelnen Index reduzieren?

    Von

       1  2   
       1  1  2        
    a  2  1  1
    b  2  1  0
    c  1  0  0
    

    Zu

       1|1  2|1  2|2               
    a    2    1    1
    b    2    1    0
    c    1    0    0
    
268
piRSquared

Wir beginnen mit der Beantwortung der ersten Frage:

Frage 1

Warum bekomme ich ValueError: Index contains duplicate entries, cannot reshape

Dies liegt daran, dass pandas versucht, entweder ein columns - oder ein index -Objekt mit doppelten Einträgen neu zu indizieren. Es gibt verschiedene Methoden, die einen Pivot ausführen können von ihnen sind nicht gut geeignet, wenn es Duplikate der Schlüssel gibt, auf denen die Pivot-Funktion angewendet werden soll. Beispiel: Betrachten Sie pd.DataFrame.pivot. Ich weiß, dass es doppelte Einträge gibt, die das row gemeinsam haben. und col Werte:

df.duplicated(['row', 'col']).any()

True

Also wenn ich pivot benutze

df.pivot(index='row', columns='col', values='val0')

Ich erhalte den oben genannten Fehler. In der Tat erhalte ich den gleichen Fehler, wenn ich versuche, die gleiche Aufgabe auszuführen mit:

df.set_index(['row', 'col'])['val0'].unstack()

Hier ist eine Liste von Redewendungen, mit denen wir schwenken können

  1. pd.DataFrame.groupby + pd.DataFrame.unstack
    • Guter allgemeiner Ansatz für nahezu jede Art von Pivot
    • Sie geben alle Spalten an, die die geschwenkten Zeilen- und Spaltenebenen in einer Gruppe bilden. Anschließend wählen Sie die verbleibenden Spalten aus, die Sie aggregieren möchten, und die Funktionen, für die Sie die Aggregation durchführen möchten. Schließlich geben Sie unstack die Ebenen an, die im Spaltenindex enthalten sein sollen.
  2. pd.DataFrame.pivot_table
    • Eine verherrlichte Version von groupby mit einer intuitiveren API. Für viele Menschen ist dies der bevorzugte Ansatz. Und ist der beabsichtigte Ansatz der Entwickler.
    • Geben Sie die Zeilenebene, die Spaltenebenen, die zu aggregierenden Werte und die Funktionen an, um Aggregationen durchzuführen.
  3. pd.DataFrame.set_index + pd.DataFrame.unstack
    • Praktisch und intuitiv für einige (ich selbst eingeschlossen). Kann nicht mit doppelten gruppierten Schlüsseln umgehen.
    • Ähnlich wie im groupby -Paradigma geben wir alle Spalten an, die letztendlich entweder Zeilen- oder Spaltenebenen sein werden, und legen diese als Index fest. Wir unstack dann die Ebenen, die wir in den Spalten wollen. Wenn die verbleibenden Index- oder Spaltenebenen nicht eindeutig sind, schlägt diese Methode fehl.
  4. pd.DataFrame.pivot
    • Sehr ähnlich zu set_index, Da es die Beschränkung für doppelte Schlüssel teilt. Die API ist ebenfalls sehr begrenzt. Es werden nur skalare Werte für index, columns, values akzeptiert.
    • Ähnlich wie bei der Methode pivot_table Wählen wir Zeilen, Spalten und Werte aus, auf denen die Pivot-Funktion ausgeführt werden soll. Wir können jedoch keine Aggregate erstellen. Wenn Zeilen oder Spalten nicht eindeutig sind, schlägt diese Methode fehl.
  5. pd.crosstab
    • Dies ist eine spezielle Version von pivot_table Und in ihrer reinsten Form die intuitivste Möglichkeit, mehrere Aufgaben auszuführen.
  6. pd.factorize + np.bincount
    • Dies ist eine hochentwickelte Technik, die sehr dunkel, aber sehr schnell ist. Es kann nicht unter allen Umständen verwendet werden, aber wenn es verwendet werden kann und Sie damit vertraut sind, werden Sie die Performance-Belohnungen ernten.
  7. pd.get_dummies + pd.DataFrame.dot
    • Ich benutze dies, um geschickt Kreuztabellen zu erstellen.

Beispiele

Für jede weitere Antwort und Frage beantworte ich sie mit pd.DataFrame.pivot_table. Dann biete ich Alternativen an, um die gleiche Aufgabe auszuführen.

Frage 3

Wie schwenke ich df so, dass die col-Werte Spalten sind, row-Werte den Index, der Mittelwert von val0 Die Werte und fehlende Werte sind 0?

  • pd.DataFrame.pivot_table

    • fill_value Ist standardmäßig nicht eingestellt. Ich neige dazu, es angemessen einzustellen. In diesem Fall habe ich 0 Eingestellt. Beachten Sie, dass ich Frage 2 übersprungen habe , da dies mit dieser Antwort ohne fill_value Identisch ist.
    • aggfunc='mean' Ist die Standardeinstellung und ich musste sie nicht einstellen. Ich habe es aufgenommen, um es deutlich zu machen.

      df.pivot_table(
          values='val0', index='row', columns='col',
          fill_value=0, aggfunc='mean')
      
      col   col0   col1   col2   col3  col4
      row                                  
      row0  0.77  0.605  0.000  0.860  0.65
      row2  0.13  0.000  0.395  0.500  0.25
      row3  0.00  0.310  0.000  0.545  0.00
      row4  0.00  0.100  0.395  0.760  0.24
      
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].mean().unstack(fill_value=0)
    
  • pd.crosstab

    pd.crosstab(
        index=df['row'], columns=df['col'],
        values=df['val0'], aggfunc='mean').fillna(0)
    

Frage 4

Kann ich etwas anderes als mean bekommen, wie vielleicht sum?

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index='row', columns='col',
        fill_value=0, aggfunc='sum')
    
    col   col0  col1  col2  col3  col4
    row                               
    row0  0.77  1.21  0.00  0.86  0.65
    row2  0.13  0.00  0.79  0.50  0.50
    row3  0.00  0.31  0.00  1.09  0.00
    row4  0.00  0.10  0.79  1.52  0.24
    
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].sum().unstack(fill_value=0)
    
  • pd.crosstab

    pd.crosstab(
        index=df['row'], columns=df['col'],
        values=df['val0'], aggfunc='sum').fillna(0)
    

Frage 5

Kann ich mehr als eine Aggregation gleichzeitig durchführen?

Beachten Sie, dass ich für pivot_table Und cross_tab Eine Liste von Callables übergeben musste. Andererseits kann groupby.agg Zeichenfolgen für eine begrenzte Anzahl von Sonderfunktionen annehmen. groupby.agg Hätte auch dieselben Callables verwendet, die wir an die anderen übergeben haben, aber es ist oft effizienter, die Namen der Zeichenfolgenfunktionen zu nutzen, da Effizienzsteigerungen erzielt werden müssen.

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index='row', columns='col',
        fill_value=0, aggfunc=[np.size, np.mean])
    
         size                      mean                           
    col  col0 col1 col2 col3 col4  col0   col1   col2   col3  col4
    row                                                           
    row0    1    2    0    1    1  0.77  0.605  0.000  0.860  0.65
    row2    1    0    2    1    2  0.13  0.000  0.395  0.500  0.25
    row3    0    1    0    2    0  0.00  0.310  0.000  0.545  0.00
    row4    0    1    2    2    1  0.00  0.100  0.395  0.760  0.24
    
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].agg(['size', 'mean']).unstack(fill_value=0)
    
  • pd.crosstab

    pd.crosstab(
        index=df['row'], columns=df['col'],
        values=df['val0'], aggfunc=[np.size, np.mean]).fillna(0, downcast='infer')
    

Frage 6

Kann ich über mehrere Wertespalten aggregieren?

  • pd.DataFrame.pivot_table Wir übergeben values=['val0', 'val1'] Aber wir hätten das komplett weglassen können

    df.pivot_table(
        values=['val0', 'val1'], index='row', columns='col',
        fill_value=0, aggfunc='mean')
    
          val0                             val1                          
    col   col0   col1   col2   col3  col4  col0   col1  col2   col3  col4
    row                                                                  
    row0  0.77  0.605  0.000  0.860  0.65  0.01  0.745  0.00  0.010  0.02
    row2  0.13  0.000  0.395  0.500  0.25  0.45  0.000  0.34  0.440  0.79
    row3  0.00  0.310  0.000  0.545  0.00  0.00  0.230  0.00  0.075  0.00
    row4  0.00  0.100  0.395  0.760  0.24  0.00  0.070  0.42  0.300  0.46
    
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0', 'val1'].mean().unstack(fill_value=0)
    

Frage 7

Kann durch mehrere Spalten unterteilt werden?

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index='row', columns=['item', 'col'],
        fill_value=0, aggfunc='mean')
    
    item item0             item1                         item2                   
    col   col2  col3  col4  col0  col1  col2  col3  col4  col0   col1  col3  col4
    row                                                                          
    row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.605  0.86  0.65
    row2  0.35  0.00  0.37  0.00  0.00  0.44  0.00  0.00  0.13  0.000  0.50  0.13
    row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.000  0.28  0.00
    row4  0.15  0.64  0.00  0.00  0.10  0.64  0.88  0.24  0.00  0.000  0.00  0.00
    
  • pd.DataFrame.groupby

    df.groupby(
        ['row', 'item', 'col']
    )['val0'].mean().unstack(['item', 'col']).fillna(0).sort_index(1)
    

Frage 8

Kann durch mehrere Spalten unterteilt werden?

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index=['key', 'row'], columns=['item', 'col'],
        fill_value=0, aggfunc='mean')
    
    item      item0             item1                         item2                  
    col        col2  col3  col4  col0  col1  col2  col3  col4  col0  col1  col3  col4
    key  row                                                                         
    key0 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.86  0.00
         row2  0.00  0.00  0.37  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.50  0.00
         row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.00  0.00  0.00
         row4  0.15  0.64  0.00  0.00  0.00  0.00  0.00  0.24  0.00  0.00  0.00  0.00
    key1 row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.81  0.00  0.65
         row2  0.35  0.00  0.00  0.00  0.00  0.44  0.00  0.00  0.00  0.00  0.00  0.13
         row3  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.28  0.00
         row4  0.00  0.00  0.00  0.00  0.10  0.00  0.00  0.00  0.00  0.00  0.00  0.00
    key2 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.40  0.00  0.00
         row2  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.13  0.00  0.00  0.00
         row4  0.00  0.00  0.00  0.00  0.00  0.64  0.88  0.00  0.00  0.00  0.00  0.00
    
  • pd.DataFrame.groupby

    df.groupby(
        ['key', 'row', 'item', 'col']
    )['val0'].mean().unstack(['item', 'col']).fillna(0).sort_index(1)
    
  • pd.DataFrame.set_index, Da der Schlüsselsatz sowohl für Zeilen als auch für Spalten eindeutig ist

    df.set_index(
        ['key', 'row', 'item', 'col']
    )['val0'].unstack(['item', 'col']).fillna(0).sort_index(1)
    

Frage 9

Kann ich die Häufigkeit, mit der die Spalten und Zeilen zusammen vorkommen, auch als "Kreuztabelle" bezeichnen?

  • pd.DataFrame.pivot_table

    df.pivot_table(index='row', columns='col', fill_value=0, aggfunc='size')
    
        col   col0  col1  col2  col3  col4
    row                               
    row0     1     2     0     1     1
    row2     1     0     2     1     2
    row3     0     1     0     2     0
    row4     0     1     2     2     1
    
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].size().unstack(fill_value=0)
    
  • pd.cross_tab

    pd.crosstab(df['row'], df['col'])
    
  • pd.factorize + np.bincount

    # get integer factorization `i` and unique values `r`
    # for column `'row'`
    i, r = pd.factorize(df['row'].values)
    # get integer factorization `j` and unique values `c`
    # for column `'col'`
    j, c = pd.factorize(df['col'].values)
    # `n` will be the number of rows
    # `m` will be the number of columns
    n, m = r.size, c.size
    # `i * m + j` is a clever way of counting the 
    # factorization bins assuming a flat array of length
    # `n * m`.  Which is why we subsequently reshape as `(n, m)`
    b = np.bincount(i * m + j, minlength=n * m).reshape(n, m)
    # BTW, whenever I read this, I think 'Bean, Rice, and Cheese'
    pd.DataFrame(b, r, c)
    
          col3  col2  col0  col1  col4
    row3     2     0     0     1     0
    row2     1     2     1     0     2
    row0     1     0     1     2     1
    row4     2     2     0     1     1
    
  • pd.get_dummies

    pd.get_dummies(df['row']).T.dot(pd.get_dummies(df['col']))
    
          col0  col1  col2  col3  col4
    row0     1     2     0     1     1
    row2     1     0     2     1     2
    row3     0     1     0     2     0
    row4     0     1     2     2     1
    

Frage 10

Wie konvertiere ich einen DataFrame von lang nach breit, indem ich NUR zwei Spalten schwenke?

Der erste Schritt besteht darin, jeder Zeile eine Nummer zuzuweisen. Diese Nummer ist der Zeilenindex dieses Werts im Pivot-Ergebnis. Dies geschieht mit GroupBy.cumcount :

df2.insert(0, 'count', df.groupby('A').cumcount())
df2

   count  A   B
0      0  a   0
1      1  a  11
2      2  a   2
3      3  a  11
4      0  b  10
5      1  b  10
6      2  b  14
7      0  c   7

Frage 11

Wie kann ich den Mehrfachindex nach pivot auf einen einzelnen Index reduzieren?

Wenn columns, geben Sie object mit der Zeichenfolge join ein.

df.columns = df.columns.map('|'.join)

sonst format

df.columns = df.columns.map('{0[0]}|{0[1]}'.format) 
229
piRSquared