Gemiddelde data uit meerdere databestanden in Python met panda's

Ik heb 30 csv-gegevensbestanden van 30 herhaalde runs van een experiment dat ik heb uitgevoerd. Ik gebruik de functie read_csv() van panda's om de gegevens in een lijst met DataFrames te lezen. Ik zou graag een enkel DataFrame uit deze lijst willen maken, met daarin het gemiddelde van de 30 DataFrames voor elke kolom. Is er een ingebouwde manier om dit te bereiken?

Ter verduidelijking, ik zal het voorbeeld in de onderstaande antwoorden toelichten. Stel dat ik twee DataFrames heb:

>>> x
          A         B         C
0 -0.264438 -1.026059 -0.619500
1  0.927272  0.302904 -0.032399
2 -0.264273 -0.386314 -0.217601
3 -0.871858 -0.348382  1.100491
>>> y
          A         B         C
0  1.923135  0.135355 -0.285491
1 -0.208940  0.642432 -0.764902
2  1.477419 -1.659804 -0.431375
3 -1.191664  0.152576  0.935773

Wat is de samenvoegfunctie die ik zou moeten gebruiken om een ​​3D-array van soorten te maken met het DataFrame? b.v.

>>> automagic_merge(x, y)
                      A                      B                      C
0 [-0.264438,  1.923135] [-1.026059,  0.135355] [-0.619500, -0.285491]
1 [ 0.927272, -0.208940] [ 0.302904,  0.642432] [-0.032399, -0.764902]
2 [-0.264273,  1.477419] [-0.386314, -1.659804] [-0.217601, -0.431375]
3 [-0.871858, -1.191664] [-0.348382,  0.152576] [ 1.100491,  0.935773]

dus ik kan het gemiddelde, s.e.m., etc. op die lijsten berekenen in plaats van de hele kolom.

2

3 antwoord

Bekijken:

In [14]: glued = pd.concat([x, y], axis=1, keys=['x', 'y'])

In [15]: glued
Out[15]: 
          x                             y                    
          A         B         C         A         B         C
0 -0.264438 -1.026059 -0.619500  1.923135  0.135355 -0.285491
1  0.927272  0.302904 -0.032399 -0.208940  0.642432 -0.764902
2 -0.264273 -0.386314 -0.217601  1.477419 -1.659804 -0.431375
3 -0.871858 -0.348382  1.100491 -1.191664  0.152576  0.935773

In [16]: glued.swaplevel(0, 1, axis=1).sortlevel(axis=1)
Out[16]: 
          A                   B                   C          
          x         y         x         y         x         y
0 -0.264438  1.923135 -1.026059  0.135355 -0.619500 -0.285491
1  0.927272 -0.208940  0.302904  0.642432 -0.032399 -0.764902
2 -0.264273  1.477419 -0.386314 -1.659804 -0.217601 -0.431375
3 -0.871858 -1.191664 -0.348382  0.152576  1.100491  0.935773

In [17]: glued = glued.swaplevel(0, 1, axis=1).sortlevel(axis=1)

In [18]: glued
Out[18]: 
          A                   B                   C          
          x         y         x         y         x         y
0 -0.264438  1.923135 -1.026059  0.135355 -0.619500 -0.285491
1  0.927272 -0.208940  0.302904  0.642432 -0.032399 -0.764902
2 -0.264273  1.477419 -0.386314 -1.659804 -0.217601 -0.431375
3 -0.871858 -1.191664 -0.348382  0.152576  1.100491  0.935773

Voor de goede orde was het niet nodig om het niveau te ruilen en opnieuw te ordenen, alleen voor visuele doeleinden.

Dan kun je dingen doen als:

In [19]: glued.groupby(level=0, axis=1).mean()
Out[19]: 
          A         B         C
0  0.829349 -0.445352 -0.452496
1  0.359166  0.472668 -0.398650
2  0.606573 -1.023059 -0.324488
3 -1.031761 -0.097903  1.018132
7
toegevoegd
Precies wat ik zocht. Bedankt!
toegevoegd de auteur Randy Olson, de bron

Ik heb een manier bedacht om het te doen.

pandas DataFrames can be added together with the DataFrame.add() function: http://pandas.sourceforge.net/generated/pandas.DataFrame.add.html

Dus ik kan de DataFrames aan elkaar toevoegen en dan delen door het aantal DataFrames, bijvoorbeeld:

avgDataFrame = DataFrameList[0]

for i in range(1, len(DataFrameList)):
    avgDataFrame = avgDataFrame.add(DataFrameList[i])

avgDataFrame = avgDataFrame/len(DataFrameList)
2
toegevoegd
Ik vind dit antwoord leuk omdat het kan worden gebruikt voor het middelen van meerdere en potentieel grote dataframes (gecombineerd met het on-the-fly lezen van de inkomende dataframes om geheugen te besparen).
toegevoegd de auteur rocarvaj, de bron

Bekijk de functie pandas.concat() . Wanneer u in uw bestanden leest, kunt u concat gebruiken om de resulterende DataFrames samen te voegen tot één, en dan gewoon normale pandasmiddelingstechnieken gebruiken om ze te matigen.

Om het te gebruiken, geeft u het gewoon door een lijst met de DataFrames die u wilt samengevoegd:

>>> x
          A         B         C
0 -0.264438 -1.026059 -0.619500
1  0.927272  0.302904 -0.032399
2 -0.264273 -0.386314 -0.217601
3 -0.871858 -0.348382  1.100491
>>> y
          A         B         C
0  1.923135  0.135355 -0.285491
1 -0.208940  0.642432 -0.764902
2  1.477419 -1.659804 -0.431375
3 -1.191664  0.152576  0.935773
>>> pandas.concat([x, y])
          A         B         C
0 -0.264438 -1.026059 -0.619500
1  0.927272  0.302904 -0.032399
2 -0.264273 -0.386314 -0.217601
3 -0.871858 -0.348382  1.100491
0  1.923135  0.135355 -0.285491
1 -0.208940  0.642432 -0.764902
2  1.477419 -1.659804 -0.431375
3 -1.191664  0.152576  0.935773
1
toegevoegd
Ik heb mijn antwoord bewerkt om een ​​eenvoudig voorbeeld te geven.
toegevoegd de auteur BrenBarn, de bron
Misschien heb ik je vraag verkeerd begrepen. Kun je je vraag bewerken om meer specifiek te zijn over wat je bedoelt met "het gemiddelde DataFrame"? Ik dacht dat je het gemiddelde van alle waarden in alle DataFrames bedoelde.
toegevoegd de auteur BrenBarn, de bron
Dus als je eenmaal je nieuwe DataFrame df hebt met alle aaneengeschakelde gegevens, voer dan df.mean() uit zoals je zou doen met elk ander DataFrame.
toegevoegd de auteur BrenBarn, de bron
Als de documentatie verwarrend is, zou ik het op prijs stellen als er hulp wordt geboden om het te verbeteren (of specifiekere kritiek!).
toegevoegd de auteur Wes McKinney, de bron
Bent u er bekend genoeg mee om een ​​generiek voorbeeld te geven? De tutorial op pandas.sourceforge.net/merging.html is nogal verwarrend.
toegevoegd de auteur Randy Olson, de bron
Rechts rechts, dat de twee DataFrames samen geeft. Maar hoe gebruik ik dat samengevoegde DataFrame om het gemiddelde DataFrame te maken?
toegevoegd de auteur Randy Olson, de bron
Dat is correct. Ik probeer een DataFrame aan te maken (dat ik het "gemiddelde DataFrame" noem), dat de gemiddelden van alle kolommen in mijn lijst met DataFrames bevat.
toegevoegd de auteur Randy Olson, de bron
Ik heb het gevoel dat dit heel dichtbij is, maar er ontbreekt een klein detail dat ik me realiseerde dat ik wegliep: ik heb de gemiddelden per rij nodig. Dus in jouw voorbeeld hierboven zou ik het gemiddelde willen van x ["A"] [0] en y ["A"] [0], x ["A"] [1] en y ["A"] [1 ], enz.
toegevoegd de auteur Randy Olson, de bron
Ik heb een bewerking gemaakt van mijn oorspronkelijke vraag om te verduidelijken waarover ik nog steeds verward ben.
toegevoegd de auteur Randy Olson, de bron
Ik begin me af te vragen of MultiIndex de betere oplossing is. Iedereen met meer ervaring weet of dat de juiste weg is om te volgen?
toegevoegd de auteur Randy Olson, de bron