Aufteilung pandas Serie in mehrere Spalten

Ich bin das extrahieren von große Mengen von Einträgen aus einer Datenbank (> 15 Millionen Einträge) mit dem Ziel, den Export in eine CSV-Datei. Was bekomme ich am Ende meiner Anfrage ist ein ein-Spalten-dataframe mit über 15 Millionen Zeilen. Ich bin auf der Suche nach einer Funktion zum splitten der Einträge in mehreren Spalten auf jeder million Einträge.

Also für 5 Millionen Einträge-Spalte, ich möchte 5 Spalten von 1 million Einträgen, die jeweils.

Vielen Dank im Voraus!

InformationsquelleAutor John_Mtl | 2016-05-04



2 Replies
  1. 3

    Stimme ich mit @EdChum, dass diese einfachsten wäre angesichts einer Reihe-Objekt mit dem Namen s:

    d = pd.DataFrame(s.values.reshape(1000000, -1))

    würde verändern Sie Ihre Serie in einen DataFrame der Form (1,000,000, s.len /1,000,000).


    Jedoch, die obige funktioniert nur, wenn Sie eine Reihe, deren Länge ein genaues Vielfaches von 1.000.000. Alternativ könnte man etwas machen wie:

        # note with python3, you need to use integer division //here
        s.index = pd.MultiIndex.from_tuples([(x/1000000,x%1000000) for x in s.index])
        # or an alternative below which does the same thing
        #s.index = pd.MultiIndex.from_tuples(s.index.map(lambda x: (x/1000000, x%1000000)))
        s.unstack(0)

    die geben Sie mehrere Spalten die gleiche Länge mit der letzten Spalte gepolstert mit NaNs.

    Hier ist ein Beispiel mit eine Reihe von Länge 55 und ich möchte, aufgeteilt in die Spalten der Länge 10. Hinweis die Letzte Spalte hat die letzten 5 Werte, Satz auf NaN:

    In [42]: s = pd.Series(np.arange(55))
    
    In [43]: s
    Out[43]: 
    0      0
    1      1
    2      2
    ...
    53    53
    54    54
    dtype: int64
    
    #                                                      with python3 x//10, x%10
    In [44]: s.index = pd.MultiIndex.from_tuples(s.index.map(lambda x: (x/10, x%10)))
    
    In [45]: s.unstack(0)
    Out[45]: 
       0   1   2   3   4   5
    0  0  10  20  30  40  50
    1  1  11  21  31  41  51
    2  2  12  22  32  42  52
    3  3  13  23  33  43  53
    4  4  14  24  34  44  54
    5  5  15  25  35  45 NaN
    6  6  16  26  36  46 NaN
    7  7  17  27  37  47 NaN
    8  8  18  28  38  48 NaN
    9  9  19  29  39  49 NaN

    Beachten Sie zwei Dinge:

    1. dass mit s.index.map(lambda ...) sollte schneller sein als die Liste Verständnis für sehr große arrays.

    2. wenn mit Python ist3, stellen Sie sicher, dass Benutzer bei integer-division in der lambda-Funktion: lambda x: (x //N, x % N).

    • Getestet habe ich es nicht und ich erhalte die gleiche Ausgabe wie erwähnt. Anstatt 1,2,3, etc. Ich habe 0.0, 0.1, 0.2 für die Spalten. Bin ich etwas fehlt?
    • Welche Methode hast du test? Hat Ihr Serien-index bei 0 beginnen und zu erhöhen, um len(Serie)-1?
    • Ich habe sowohl Methoden, die Sie wissen mit der sehr Beispiel oben verwendet
    • verwenden Sie Python ist3? Wenn dem so ist, sehen die kleinen Bearbeiten-oben; Sie müssen integer-division // in der lambda-Funktion.
    • Vielen Dank für das Bearbeiten und Ihre Zeit, es funktioniert jetzt perfekt!
  2. 0

    Und die hässlichste Zeile code award geht an….

    x = 1000000
    pd.concat([pd.DataFrame(np.array(df[df.columns[0]].tolist())[:-(len(df)%x )].reshape(len(df)//x, x)), pd.DataFrame(df[df.columns[0]].tolist()[len(df) - len(df)%x:])] , axis=1)

    Sollten Sie eingestellt werden, für jeden Wert von x an. Kein Zweifel Zeug ist zu 100% schöner, war nur Herumspielen mit ipython 😉

    • Ich bekommen einen memory-Fehler von Python versuchen, diese ein. Denke, es ist zu viel zu Essen!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.