Toon posts:

python xlsx converteer rij waarden naar kolommen

Pagina: 1
Acties:

Vraag


  • satmarco
  • Registratie: Oktober 2002
  • Laatst online: 13-05 13:38
Ik probeer een database export in excel om te bouwen naar een leesbaarder formaat.

De xlsx ziet er ongeveer zo uit, maar dan met meer verschillende eigenschappen:

nummereigenschapwaarde
100eigenschap1Z50
100eigenschap2Z60
200eigenschap1Z80
200eigenschap2Z90
300eigenschap1Z80


En dan wil ik die ombouwen naar dit formaat:

nummereigenschap1eigenschap2
100Z50Z60
200Z80Z90
300Z80-



Nu ben ik nog maar een aantal weken bezig om python te leren maar kom er niet uit hoe ik dit voor elkaar kan krijgen.
Ik ben vooral met pandas aan het proberen geweest met onderstaande regels.

Python:
1
2
3
4
5
6
7
for row in df.itertuples(index=False)

for ind,row in df.iterrows():

for k,v in df.iteritems():

df_grouped = df.groupby('nummer')


Maar in alle gevallen bleven de eigenschappen met bijbehorende waarde onder elkaar staan en kreeg ik ze niet achter elkaar op een regel.
Ik merk dat zoeken naar de oplossing lastig is al je niet weet hoe je de vraag op wil gaan lossen, en zoektermen als 'python convert / transpose xlsx row values to columns' geven mij niet de juiste richting om het op te lossen.

Zou iemand mij op weg kunnen helpen met een stukje voorbeeld code?

Beste antwoord (via satmarco op 02-02-2021 11:08)


  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 00:14
Eigenlijk is iterrows nooit het goede antwoord ;)

Maar die pivot is toch niet zo complex?

Python:
1
2
3
4
5
df.pivot(
  index='<kolom met IDs>' ,
  columns='<kolom met de nieuwe kolomnamen>' ,
  values='<kolom met de waardes>' , 
)


Als je je originele DataFrame bekijkt kun je het zo invullen. Eventueel een reset_index() erbij, zodat je IDs weer als kolom te benaderen zijn...

[Voor 7% gewijzigd door Morrar op 01-02-2021 19:23]

Alle reacties


  • heintjeput
  • Registratie: Juni 2003
  • Laatst online: 11-08 06:21
In excel zou ik het oplossen met een pivottabel, je zou de panda’s functie daarvoor eens kunnen proberen panda’s docs

Als je grouped by wil gebruiken probeer dan eerst eens zonder een for loop handmatig wat te bereiken.

  • hostname
  • Registratie: April 2009
  • Laatst online: 06-08 12:13
Kijk eens naar de unstack method ;)

  • satmarco
  • Registratie: Oktober 2002
  • Laatst online: 13-05 13:38
De pivot functie kom ik nog niet uit.

De unstack doet ook nog niet wat ik dacht dat het zou doen.
Als ik mijn excel gebruik in de voorbeeld code

Python:
1
2
3
4
5
6
7
8
9
import pandas as pd
import numpy as np

index = pd.MultiIndex.from_tuples([('100', 'eigenschap1','Z50'), ('100', 'eigenschap2','Z60'),
                                   ('200', 'eigenschap1','Z80'), ('200', 'eigenschap2','Z90')])
print(index)
s = pd.Series(np.arange(1.0, 5.0), index=index)
print(s)
print(s.unstack(level=-1))


Dan geeft dat deze output

Z50 Z60 Z80 Z90
100 eigenschap1 1.0NaNNaNNaN
eigenschap2 NaN 2.0NaN NaN
200 eigenschap1 NaN NaN 3.0NaN
eigenschap2 NaN NaN NaN 4.0


Heb wat getest met verschillende levels maar daar werd het nog niet beter van. 8)7

  • satmarco
  • Registratie: Oktober 2002
  • Laatst online: 13-05 13:38
Wat ik wil heb ik nu zo'n beetje in beeld met deze code.

Python:
1
2
3
4
5
6
7
8
for index, row in df.iterrows():
    x = row['nummer']
    if row['eigenschap'] == 'eigenschap1':
        y = row['waarde']
    if row['eigenschap'] == 'eigenschap2':
       z= row['waarde']
       final = x, y, z
       print(final)


De uitvoer is dan
(100, Z50, Z60)
(200, Z80, Z90)
enz.

De print final geeft het volledige beeld, wel met dubbele regels doordat de loop meerdere keren langs hetzelfde nummer loopt maar dat is er later wel weer uit te filteren.

Hoe krijg ik dit nu uitgevoerd naar een nieuw dataframe?

Acties:
  • Beste antwoord
  • 0Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 00:14
Eigenlijk is iterrows nooit het goede antwoord ;)

Maar die pivot is toch niet zo complex?

Python:
1
2
3
4
5
df.pivot(
  index='<kolom met IDs>' ,
  columns='<kolom met de nieuwe kolomnamen>' ,
  values='<kolom met de waardes>' , 
)


Als je je originele DataFrame bekijkt kun je het zo invullen. Eventueel een reset_index() erbij, zodat je IDs weer als kolom te benaderen zijn...

[Voor 7% gewijzigd door Morrar op 01-02-2021 19:23]


  • satmarco
  • Registratie: Oktober 2002
  • Laatst online: 13-05 13:38
Dank je voor het extra voorbeeldje met pivot, ik zag ineens de logica.
En achteraf is het simpel zat..
Omdat de excel meer kolommen heeft liep ik nog wel tegen de melding "Index contains duplicate entries, cannot reshape" aan. Die heb ik opgelost door de drop_duplicates toe te voegen.

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pandas as pd
pd.set_option('display.width', 4000)
pd.set_option('display.max_columns', None)

df = pd.read_excel("test.xlsx")
df = df[['nummer','eigenschap' ,'waarde']]
df = df.drop_duplicates()

df_new = df.pivot(
  index='nummer' ,
  columns='eigenschap' ,
  values='waarde' ,
)

print(df_new)
Pagina: 1



Nintendo Switch (OLED model) Apple iPhone SE (2022) LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S22 Garmin fēnix 7 Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2022 Hosting door True

Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee