GOOGLE ADS

Mittwoch, 20. April 2022

Wie erstellt man eine Funktion, die die Summe von drei Spalten nimmt, aber nach jeder Iteration ändert sich eine Spalte?

Ich habe den folgenden DataFrame namens df:






















































NumerischLand1Land2Land3Land4Land5
5JaNeinNeinJaJa
zehnNeinJaJaNeinJa
6JaNeinNeinJaNein
achtJaNeinJaJaJa
neunNeinJaNeinJaNein

Lösung des Problems

Dies kann erreicht werden, indem die Spalten mit Ja maskiert und dann verwendet np.einsumwerden, um True oder False für jede Kombination von zwei Spalten für jede Zeile zu erhalten. Multiplizieren Sie mit den Werten in der numerischen Spalte und sumüber der Achse, die die Zeilen darstellt (bei meiner Wahl der Indizes einsumist es die letzte). Erstellen Sie wie gewünscht einen Datenrahmen mit Index und Spalten

m = df.drop(['Numeric'], axis=1).eq('Yes')
print(m)
# Country1 Country2 Country3 Country4 Country5
# 0 True False False True True
# 1 False True True False True
# 2 True False False True False
# 3 True False True True True
# 4 False True False True False
res = pd.DataFrame(
data=(np.einsum('ij,ik->jki',m,m)
*df['Numeric'].to_numpy()[None,:]
).sum(axis=-1),
index=m.columns,
columns = m.columns
)
print(res)
# Country1 Country2 Country3 Country4 Country5
# Country1 19 0 8 19 13
# Country2 0 19 10 9 10
# Country3 8 10 18 8 18
# Country4 19 9 8 28 13
# Country5 13 10 18 13 23

Hinweis: Sie könnten sogar data = np.einsum('ij,ik,i->jk',m,m,df['Numeric'].to_numpy())die Multiplikation mit der numerischen Spalte und die Summe über die letzte Achse direkt einschließen.

BEARBEITEN: Hier ist eine Möglichkeit, combinations_with_replacementdie möglicherweise einfacher zu verstehen ist, was passiert (aber die ursprüngliche Antwort mit einsumführt die gleiche Art von Operationen aus).

from itertools import combinations_with_replacement
#split mask and values
m = df.drop(['Numeric'], axis=1).eq('Yes')
arr = df['Numeric'].to_numpy()
# create result dataframe
res = pd.DataFrame(data=0, index=m.columns, columns=m.columns)
# fill each cell
for colA, colB in combinations_with_replacement(m.columns, 2):
res.loc[colA, colB] = res.loc[colB, colA] = ((m[colA]&m[colB])*arr).sum()
print(res)
# same result

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...