Mam następującą przykładową ramkę danych:
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']})
który tworzy tę ramkę danych:
+-------+----------+---------------+----------------+
| 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 |
+-------+----------+---------------+----------------+
Próbuję „roztopić”, choć nie do końca kolumny źródłowe i testowe, kolumny w nowej ramce danych, aby wyglądały tak:
+-------+----------+-----------+----------------+---------------+----------+
| 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 |
+-------+----------+-----------+----------------+---------------+----------+
Rozumiem, że obrót i stopienie wykonają całą kolumnę DisplayLabel, a nie tylko niektóre wartości.
Jakakolwiek pomoc byłaby bardzo mile widziana, ponieważ przeczytałem Pandas Melt i Pandas Pivot, a także kilka odniesień na temat przepełnienia stosu i nie mogę znaleźć sposobu, aby to zrobić szybko.
Dzięki!
Value 1
znajduje się podLogic
wierszem Test w drugiej ramce danych?Odpowiedzi:
Możemy osiągnąć Twój wynik, stosując logikę i przestawianie, dzielimy twoje dane, sprawdzając, czy
DisplayLabel
zawiera,Value
a następnie łączymyjoin
je z powrotem:Jeśli chcesz podać dokładną kolejność kolumn jako przykład, użyj
DataFrame.reindex
:Szczegółowo - krok po kroku:
źródło
set_index
,unstack
zatemmelt
Funkcja niestandardowa dla
groupby
Ustawiać
źródło
Próbowałem innego podejścia, najpierw
pivot
używając,unstack
a następnie częściowo konwertującwide_to_long
(Przepraszam, jeśli to nie jest wydajne, ale wydaje się, że uzyskuje pożądaną wydajność)źródło