ich ein Datenrahmen haben zusammenzufassen, die wie folgt aussieht:effiziente Weise alle möglichen Paare
from random import randint
import pandas as pd
df = pd.DataFrame({"ID": ["a", "b", "c", "d", "e", "f", "g"],
"Size": [randint(0,9) for i in range(0,7)]})
df
ID Size
0 a 4
1 b 3
2 c 0
3 d 2
4 e 9
5 f 5
6 g 3
Und was ich möchte erhalten, ist dies (könnte eine Matrix als auch sein):
sums_df
a b c d e f g
a 8.0 7.0 4.0 6.0 13.0 9.0 7.0
b 7.0 6.0 3.0 5.0 12.0 8.0 6.0
c 4.0 3.0 0.0 2.0 9.0 5.0 3.0
d 6.0 5.0 2.0 4.0 11.0 7.0 5.0
e 13.0 12.0 9.0 11.0 18.0 14.0 12.0
f 9.0 8.0 5.0 7.0 14.0 10.0 8.0
g 7.0 6.0 3.0 5.0 12.0 8.0 6.0
Das ist die Summe der Size
Werte für alle möglichen Paare in ID
.
Für jetzt habe ich diese einfache, aber uneffizient Code:
sums_df = pd.DataFrame()
for i in range(len(df)):
for j in range(len(df)):
sums_df.loc[i,j] = df.Size[i] + df.Size[j]
sums_df.index = list(df.ID)
sums_df.columns = list(df.ID)
Es funktioniert gut für kleine Beispiele wie diese, aber für meine eigentlichen Daten wird es zu lange, und ich bin sicher, dass es möglich ist, die verschachtelte zu vermeiden for
Schleifen. Kannst du dir einen besseren Weg vorstellen?
Danke für jede Hilfe!
Nur neugierig, warum brauchen Sie es? –
Ich habe einen anderen Datenrahmen, den ich als Adjazenzmatrix mit NetworkX verwende (nennen wir es df1), und ich möchte df1 elementweise durch sums_df dividieren, um say df2 zu erhalten. df1 enthält Häufigkeiten von gemeinsamen Elementen zwischen den IDs, aber ich habe auch die Anzahl der Elemente in jeder ID (hier Größe, und IDs sind eigentlich IDs von Gruppen). Auf diese Weise sind die Gewichte, die ich mit df2 verwende, die Anteile gemeinsamer Elemente und nicht die Häufigkeiten gemeinsamer Elemente, die df1 als Adjazenzmatrix verwenden. Ich hoffe, das ist klar genug! – atonnerre