Tengo el siguiente marco de datos de ejemplo:
df = pd.DataFrame(data = {'RecordID' : [1,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5], 'DisplayLabel' : ['Source','Test','Value 1','Value 2','Value3','Source','Test','Value 1','Value 2','Source','Test','Value 1','Value 2','Source','Test','Value 1','Value 2','Source','Test','Value 1','Value 2'],
'Value' : ['Web','Logic','S','I','Complete','Person','Voice','>20','P','Mail','OCR','A','I','Dictation','Understandable','S','I','Web','Logic','R','S']})
que crea este marco de datos:
+-------+----------+---------------+----------------+
| Index | RecordID | Display Label | Value |
+-------+----------+---------------+----------------+
| 0 | 1 | Source | Web |
| 1 | 1 | Test | Logic |
| 2 | 1 | Value 1 | S |
| 3 | 1 | Value 2 | I |
| 4 | 1 | Value 3 | Complete |
| 5 | 2 | Source | Person |
| 6 | 2 | Test | Voice |
| 7 | 2 | Value 1 | >20 |
| 8 | 2 | Value 2 | P |
| 9 | 3 | Source | Mail |
| 10 | 3 | Test | OCR |
| 11 | 3 | Value 1 | A |
| 12 | 3 | Value 2 | I |
| 13 | 4 | Source | Dictation |
| 14 | 4 | Test | Understandable |
| 15 | 4 | Value 1 | S |
| 16 | 4 | Value 2 | I |
| 17 | 5 | Source | Web |
| 18 | 5 | Test | Logic |
| 19 | 5 | Value 1 | R |
| 20 | 5 | Value 2 | S |
+-------+----------+---------------+----------------+
Estoy tratando de "deshacer" aunque no exactamente las columnas de origen y prueba en las nuevas columnas del marco de datos de modo que se vea así:
+-------+----------+-----------+----------------+---------------+----------+
| Index | RecordID | Source | Test | Result | Value |
+-------+----------+-----------+----------------+---------------+----------+
| 0 | 1 | Web | Logic | Value 1 | S |
| 1 | 1 | Web | Logic | Value 2 | I |
| 2 | 1 | Web | Logic | Value 3 | Complete |
| 3 | 2 | Person | Voice | Value 1 | >20 |
| 4 | 2 | Person | Voice | Value 2 | P |
| 5 | 3 | Mail | OCR | Value 1 | A |
| 6 | 3 | Mail | OCR | Value 2 | I |
| 7 | 4 | Dictation | Understandable | Value 1 | S |
| 8 | 4 | Dictation | Understandable | Value 2 | I |
| 9 | 5 | Web | Logic | Value 1 | R |
| 10 | 5 | Web | Logic | Value 2 | S |
+-------+----------+-----------+----------------+---------------+----------+
Tengo entendido que pivot and melt hará toda la columna DisplayLabel y no solo algunos de los valores.
Cualquier ayuda sería muy apreciada, ya que he leído el Pandas Melt y el Pandas Pivot , así como algunas referencias sobre stackoverflow y parece que no puedo encontrar una manera de hacerlo rápidamente.
¡Gracias!
Value 1
debajo de laLogic
fila Prueba en su segundo DataFrame?Respuestas:
Podemos lograr su resultado aplicando lógica y pivote, dividimos sus datos verificando si
DisplayLabel
contieneValue
y luego los volvemosjoin
a unir:Si desea el orden exacto de las columnas como su ejemplo, use
DataFrame.reindex
:En detalle, paso a paso:
fuente
set_index
,unstack
, Entoncesmelt
Función personalizada para
groupby
Preparar
fuente
Intenté un enfoque diferente de
pivot
usar primerounstack
y luego convertir parcialmentewide_to_long
(perdón si no es eficiente pero parece obtener el resultado deseado)fuente