python xlsx converteer rij waarden naar kolommen

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • satmarco
  • Registratie: Oktober 2002
  • Laatst online: 26-06-2023
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: 13-05 18:10
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


Acties:
  • +2 Henk 'm!

  • heintjeput
  • Registratie: Juni 2003
  • Laatst online: 10:51
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.

Acties:
  • +1 Henk 'm!

  • hostname
  • Registratie: April 2009
  • Laatst online: 00:33
Kijk eens naar de unstack method ;)

Acties:
  • 0 Henk 'm!

  • satmarco
  • Registratie: Oktober 2002
  • Laatst online: 26-06-2023
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

Acties:
  • 0 Henk 'm!

  • satmarco
  • Registratie: Oktober 2002
  • Laatst online: 26-06-2023
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
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 13-05 18:10
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 ]


Acties:
  • +1 Henk 'm!

  • satmarco
  • Registratie: Oktober 2002
  • Laatst online: 26-06-2023
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