Pandas: Wie kann ich die wiederholen dataframe für jeden Wert in einer Reihe?

Ich habe einen dataframe (df) wie folgt:

A B
1 a
2 b
3 c

– Und a-Serie: S = pd.Series(['x','y','z']) möchte ich wiederholen Sie den dataframe df für jeden Wert in der Reihe. Das erwartete Ergebnis ist, so zu sein wie diese:
Ergebnis:

S A B
x 1 a
y 1 a
z 1 a
x 2 b
y 2 b
z 2 b
x 3 c
y 3 c
z 3 c

Wie kann ich erreichen, diese Art der Ausgabe? Ich überlege, merge oder join aber mergeing ist mir ein memory Fehler. Ich bin den Umgang mit einem ziemlich großen dataframe und Serien. Danke!

InformationsquelleAutor Praneetha | 2017-05-10



3 Replies
  1. 11

    Mithilfe von numpy, können sagen, Sie haben die Serie und der df von diffenent Längen

    s= pd.Series(['X', 'Y', 'Z', 'A']) #added a character to s to make it length 4
    s_n = len(s)
    df_n = len(df)
    pd.DataFrame(np.repeat(df.values,s_n, axis = 0), columns = df.columns, index = np.tile(s,df_n)).rename_axis('S').reset_index()
    
        S   A   B
    0   X   1   a
    1   Y   1   a
    2   Z   1   a
    3   A   1   a
    4   X   2   b
    5   Y   2   b
    6   Z   2   b
    7   A   2   b
    8   X   3   c
    9   Y   3   c
    10  Z   3   c
    11  A   3   c
    • ja, ich war auch arbeiten, auf die Lösung basiert auf pd.DataFrame(np.repeat(...)), aber du warst schneller 😉
    • Werden Sie sich besser fühlen, wenn ich sage, dass passiert bei mir die ganze Zeit? 🙂
    • was ist, wenn die Länge der Serie und dataframes sind nicht identisch und unbekannt sind?
    • man kann sagen, n = len(s) und verwenden Sie dann n in Platz 3 in meiner Antwort
    • Ich habe gerade getestet, aber lief in einen Speicher Fehler. Gibt es einen Weg, es zu tun in Brocken? Danke!
    • Haben Sie versucht, das zu Bearbeiten ich gerade geschrieben?
    • ja, das Problem mit dem Speicher zu überlasten. Brechen in Stücke wäre eine bessere Idee. Aber im nicht sicher, wie es zu tun
    • Wie viele Wiederholungen werden Sie für? Sie können zwei oder mehr dataframes mit weniger Wiederholungen und dann so etwas wie pd.concat([df1,df2,df3])
    • ja, dies würde nicht für mich arbeiten dann. Mein dataframe die Länge ist in der Nähe 90K und die Serie hat eine Länge auf 80
    • Ich laufen in der Art error: ’str‘ – Objekt ist nicht aufrufbar. Linie 3998, im Transformation index, items = [func(x) für x-index]. Könnte mal bitte erklären?

  2. 4

    UPDATE:

    hier ein bisschen geändert @A-Za-z ‚ s Lösung, die vielleicht etwas mehr Speicher speichern, aber es ist langsamer:

    x = pd.DataFrame(index=range(len(df) * len(S)))
    
    for col in df.columns:
        x[col] = np.repeat(df[col], len(s))
    
    x['S'] = np.tile(S, len(df))

    Alte falsche Antwort:

    In [94]: pd.concat([df.assign(S=S)] * len(s))
    Out[94]:
       A  B  S
    0  1  a  x
    1  2  b  y
    2  3  c  z
    0  1  a  x
    1  2  b  y
    2  3  c  z
    0  1  a  x
    1  2  b  y
    2  3  c  z
    • Meine gewünschte Ausgabe nicht. Ich möchte die Ausgabe zu wiederholen, die ursprünglichen dataframe für jeden Wert in der Reihe
    • Ich weiß, die Beispiele sind sowohl der Länge 3, aber wenn ich verstehe, OP einwandfrei, kann es sein, len(df) statt
    • die Längen können oder maynot identisch sein.. ich sollte erwähnt haben, dass
    • können Sie nach einem reproduzierbaren Daten-sets und eine gewünschte?
  3. 0

    Setup

    df = pd.DataFrame({'A': {0: 1, 1: 2, 2: 3}, 'B': {0: 'a', 1: 'b', 2: 'c'}})
    S = pd.Series(['x','y','z'], name='S')

    Lösung

    #Convert the Series to a Dataframe with desired shape of the output filled with S values.
    
    #Join df_S to df to get As and Bs
    df_S = pd.DataFrame(index=np.repeat(S.index,3), columns=['S'], data= np.tile(S.values,3))
    
    df_S.join(df)
    
    Out[54]: 
       S  A  B
    0  x  1  a
    0  y  1  a
    0  z  1  a
    1  x  2  b
    1  y  2  b
    1  z  2  b
    2  x  3  c
    2  y  3  c
    2  z  3  c

Schreibe einen Kommentar

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