Wie man gleichermaßen Wert zu reduzieren, nachdem die Gruppierung?

stimmen
2

Ich habe Tabelle , in der einige Werte zu indizieren gehören und einige andere gehören zu wiederholten Werten. Im Beispiel sidist Index, Kosten beolng sid, aber man sid viele Transaktionen und noch eine Transaktion enthalten können beliebig viele Kategorien enthalten.

df = pd.DataFrame([
    [1, 100, 1, 'A', 1, 50, 2],
    [1, 100, 2, 'A', 1, 50, 1],
    [1, 100, 2, 'B', 2, 100, 1],
    [1, 100, 2, 'C', 3, 50, 1],
    [2, 200, 3, 'D', 4, 500, 1],
    [2, 200, 4, 'C', 2, 100, 1],
    [3, 200, 5, 'B', 2, 100, 1],
    [3, 200, 5, 'A', 1, 50, 1],
    [3, 200, 5, 'A', 3, 50, 1]
], columns=['sid', 'costs', 'transaction_id', 'category', 'sku', 'price', 'quantity'])

df['revenue'] = df['price'] * df['quantity']

Also, wenn Blick auf sid Ebene I ersten Wert von Kosten und die Summe der Einnahmen zu nehmen. Dies ist, wie es sein sollte aussieht. Die Gesamtkosten - 500, einen Gesamtumsatz - 1100.

df.groupby('sid').agg({'costs': 'min', 'revenue':'sum'}).pivot_table(index='sid', margins=True, aggfunc='sum')  

Geben

Aber ich will sid nach Kategorie zersetzen. Ich kann es auf diese Weise tun.

df.groupby(['sid', 'category']).agg({'costs': 'min', 'revenue':'sum'}).pivot_table(index=['sid', 'category'], aggfunc='sum', margins=True)

Geben

Mein Problem ist, dass für jede Zeile Kosten dupliziert wurden. Und die Summe der Kosten beträgt 1100, was nicht wahr ist. Ich mag ebenso die Kosten senken in Bezug auf in jedem sid Kategorien betragen. So wird es aussieht

Geben

Ist es möglich, eine solche Rollfunktion anzuwenden?

Veröffentlicht am 18/12/2018 um 11:02
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
3

Hier ist etwas, was Sie tun können:

g = df.groupby(['sid', 'category']).agg({'revenue':'sum', 'costs': 'min'})
div = df.groupby(['sid'])['category'].nunique()
g['costs'] = g['costs']/div

                revenue     costs
sid category                     
1   A             150   33.333333
    B             100   33.333333
    C              50   33.333333
2   C             100  100.000000
    D             500  100.000000
3   A             100  100.000000
    B             100  100.000000

Und für die letzte Reihe, einschließlich der sumAdd der beiden Spalten einfach wieder am Ende:

g.pivot_table(index=['sid', 'category'], aggfunc='sum', margins=True)
Beantwortet am 18/12/2018 um 11:33
quelle vom benutzer

stimmen
2

Ich glaube , Sie Zahl dividieren müssen sidpro Gruppen erstellt von transformund size:

df = df.groupby(['sid', 'category']).agg({'costs': 'min', 'revenue':'sum'})
df['costs'] = df['costs'].div(df.groupby('sid')['costs'].transform('size'))
df = df.pivot_table(index=['sid', 'category'], aggfunc='sum', margins=True)
print (df)
                   costs  revenue
sid category                     
1   A          33.333333      150
    B          33.333333      100
    C          33.333333       50
2   C         100.000000      100
    D         100.000000      500
3   A         100.000000      100
    B         100.000000      100
All           500.000000     1100
Beantwortet am 18/12/2018 um 11:32
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more