J'ai l'exemple de trame de données suivant:
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']})
qui crée cette trame de données:
+-------+----------+---------------+----------------+
| 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 |
+-------+----------+---------------+----------------+
J'essaie de "démêler" mais pas exactement les colonnes source et de test dans de nouvelles colonnes de trame de données de sorte que cela ressemble à ceci:
+-------+----------+-----------+----------------+---------------+----------+
| 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 |
+-------+----------+-----------+----------------+---------------+----------+
Je crois comprendre que pivoter et faire fondre fera toute la colonne DisplayLabel et pas seulement certaines valeurs.
Toute aide serait grandement appréciée car j'ai lu le Pandas Melt et le Pandas Pivot ainsi que quelques références sur stackoverflow et je n'arrive pas à trouver un moyen de le faire rapidement.
Merci!
Value 1
se trouve sous laLogic
ligne Test dans votre deuxième DataFrame?Réponses:
Nous pouvons atteindre votre résultat en appliquant une logique et un pivotement, nous divisons vos données en vérifiant si elles
DisplayLabel
contiennentValue
, puis nousjoin
les recomposons :Si vous voulez l'ordre exact des colonnes comme exemple, utilisez
DataFrame.reindex
:En détail - étape par étape:
la source
set_index
,,unstack
puismelt
Fonction personnalisée pour
groupby
Installer
la source
J'ai essayé une approche différente
pivot
en utilisant d'abordunstack
puis en convertissant partiellementwide_to_long
(Désolé si ce n'est pas efficace mais cela semble obtenir la sortie souhaitée)la source