Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.python > #5496

Re: [Python-de] Anfaengerfrage: Dataframe - Zeilenmittel - Spaltenmittel

From Peter Otten <__peter__@web.de>
Newsgroups de.comp.lang.python
Subject Re: [Python-de] Anfaengerfrage: Dataframe - Zeilenmittel - Spaltenmittel
Date 2019-06-19 22:35 +0200
Organization None
Message-ID <mailman.155.1560976545.21674.python-de@python.org> (permalink)
References <1825444.o0KX4FVeTt@host> <9390763f-1e2a-fb62-50ed-6b776764aec9@goebel-consult.de> <8217725.EGQyf2vfZd@host> <2233175.VqSBi401Pp@palindrom>

Show all headers | View raw


eilfh wrote:

> Am Mittwoch, 19. Juni 2019, 14:08:33 CEST schrieb Hartmut Goebel:
>> immer "i-1" verwendest, kannst Du hier
>> "range(spalten_anzahl)" verwenden. Das läuft von 0 und bis
> 
> 
> Danke für eure schnellen Antworten
> 
> @ Hartmut:
> klappt tatsächlich,
> nur ein Verständnisproblem meinerseits :
> Indizierung fängt bei 0 an (= das sind aber die Spalten-/bzw. die
> Zeilenköpfe)

Die "Köpfe" sind nicht per Index erreichbar:

>>> df = pd.DataFrame([[1,2], [3,4], [5,6]], columns=["foo", "bar"])
>>> df.iloc[0,0]
1

Indizes einer Sequenz der Länge N laufen von 0 bis N-1,

>>> for i in range(3):
...     print(i, "abc"[i])
... 
0 a
1 b
2 c

negative Indizes zählen vom Ende einer Sequenz:

>>> df.iloc[-1,0]
5

>>> "abc"[-1]
'c'
>>> "abc"[-2]
'b'
>>> "abc"[-3]
'a'

> und dann aber i - 1, bzw. j - 1   --> 0 - 1 --> -1 ???
> aber Ergebnis stimmt (für dich sicher trivial!)
> (irgendwie denk man wohl
> -- auch nach vielen Jahren --
> immer noch in Turbo-Pascal-Strukturen)

In deinem Code-Beispiel hast du aber von 0 bis N-1 indiziert, nur etwas 
umständlich erst mit 1...N begonnen und dann jeweils 1 abgezogen. 
Auf das Endergebnis hatte das keinen Einfluss:

>>> [i-1 for i in range(1, N+1)]  # du
[0, 1, 2]

>>> [i for i in range(N)] # üblich
[0, 1, 2]


> @Peter:
> df1 = df.copy()
> habe ich dankend übernommen
> 
> df.as_matrix()
> FutureWarning: Method .as_matrix,
> das könnte ich aktualisieren (Use .values instead)

Möglicherweise ist meine Pandas-Version ein bisschen älter als deine ;)

> aber:
> meine DataFrames sind nicht quadratisch
> (vermutl. deshalb scheitert das)
> (hier im Testbsp.: 5 Spalten, 30 Zeilen)
> Abbruch, Fehlermitteilung:
> ValueError: Shape of passed values is (5, 30), indices imply (30, 30)

Das sollte eigentlich kein Problem sein. Hier ein vollständiges Script, mit 
3 Spalten und 4 Zeilen:

$ cat tmp.py
import pandas as pd

df = pd.DataFrame(
    [[1.,2.,3.], [10, 20, 30], [7, 23, 64], [6, 6, 7]],
    columns=["foo", "bar", "baz"]
)
print(df)

a = df.values
b = (a.T - a.mean(axis=1)).T - a.mean(axis=0) + a.mean()
df1 = pd.DataFrame(b, columns=df)

print(df1)

Das gibt bei mir Folgendes aus:

$ python3 tmp.py
   foo  bar  baz
0    1    2    3
1   10   20   30
2    7   23   64
3    6    6    7

[4 rows x 3 columns]
         foo       bar        baz
0   7.916667  2.166667 -10.083333
1  -1.083333  2.166667  -1.083333
2 -15.416667 -6.166667  21.583333
3   8.583333  1.833333 -10.416667

[4 rows x 3 columns]
$ 

Produziert das bei dir ein Traceback (wenn ja, was genau)?

Back to de.comp.lang.python | Previous | Next | Find similar


Thread

Re: [Python-de] Anfaengerfrage: Dataframe - Zeilenmittel - Spaltenmittel Peter Otten <__peter__@web.de> - 2019-06-19 22:35 +0200

csiph-web