Ich habe eine Menge hässlicher Kundendaten, die ich zu normalisieren versuche. Es sieht im Grunde so aus:

Customer   Order1   Order2   Order3 ... OrderN

  John      This     That     The   ...  Other
 Shelly    Thing1   Thing2   Thing3 ... ThingN
   .         .        .        .          .
   .         .        .        .          .

Also möchte ich es so ändern, dass es so aussieht:

Customer   Order

 John      This
 John      That
 John      The
 Shelly    Thing1
 Shelly    Thing2

Und so weiter.

Ich bin mir jedoch nicht sicher, wie ich das machen soll.

Jede Hilfe wäre toll!

2
DrakeMurdoch 19 Apr. 2018 im 17:21

4 Antworten

Beste Antwort

Genau ein stack und zwei reset_index Anrufe.

df
  Customer  Order1  Order2  Order3  OrderN
0     John    This    That     The   Other
1   Shelly  Thing1  Thing2  Thing3  ThingN
(df.set_index('Customer')
   .stack()
   .reset_index(level=1, drop=True)
   .reset_index(name='Order')
)

  Customer   Order
0     John    This
1     John    That
2     John     The
3     John   Other
4   Shelly  Thing1
5   Shelly  Thing2
6   Shelly  Thing3
7   Shelly  ThingN
3
cs95 19 Apr. 2018 im 14:34

pd.melt ist derjenige, den Sie sind Auf der Suche nach:

# Assuming all the other columns are orders except for the Customer column
value_list = [col for col in df.columns if col != 'Customer']

pd.melt(df, id_vars=['Customer'], value_vars=value_list,
        value_name='Order').drop('variable', axis=1)

  Customer   Order
0    John    this
1  Shelly  thing1
2    John    that
3  Shelly  thing2
4    John    that
5  Shelly  thing2
2
Bubble Bubble Bubble Gut 19 Apr. 2018 im 14:28

Ich denke, die Verwendung von stack ist etwas besser

df.set_index('Customer').stack().reset_index(level=0)
Out[1219]: 
       Customer       0
Order1     John    This
Order2     John    That
Order3     John     The
OrderN     John   Other
Order1   Shelly  Thing1
Order2   Shelly  Thing2
Order3   Shelly  Thing3
OrderN   Shelly  ThingN
2
YOBEN_S 19 Apr. 2018 im 14:32

Mit einem Verständnis

pd.DataFrame(
    [[c, o] for c, *O in df.values for o in O],
    columns=['Customer', 'Order']
)

  Customer   Order
0     John    This
1     John    That
2     John     The
3     John   Other
4   Shelly  Thing1
5   Shelly  Thing2
6   Shelly  Thing3
7   Shelly  ThingN
2
piRSquared 19 Apr. 2018 im 14:37