Hier ist eine (zugegebenermaßen over-engineered) Lösung, die langsam über Gruppen und DataFrame.apply
(diese sind vermeidet Looping, so vermeidet sie werden kann wichtig, wenn Ihr Datensatz ausreichend groß ist).
import pandas as pd
df = pd.DataFrame({'CASE': [1]*3 + [2]*2 + [3]*3,
'TYPE': ['A']*4 + ['B']*4})
Wir Gruppe von CASE
und berechnen die relativen Häufigkeiten von TYPE
A
oder B
sein:
grouped = df.groupby('CASE')
vc = (grouped['TYPE'].value_counts(normalize=True)
.unstack(level=0)
.fillna(0))
Hier ist, was vc
sieht aus wie
CASE 1 2 3
TYPE
A 1.0 0.5 0.0
B 0.0 0.5 0.0
Beachten Sie, dass alle Informationen in enthalten ist die erste Reihe. Schneiden der Reihe in die Behälter mit pd.cut
gibt das gewünschte Ergebnis:
tolerance = 1e-10
bins = [-tolerance, tolerance, 1-tolerance, 1+tolerance]
types = pd.cut(vc.loc['A'], bins=bins, labels=['B', 'MIXED', 'A'])
Wir erhalten:
CASE
1 A
2 MIXED
3 B
Name: A, dtype: category
Categories (3, object): [B < MIXED < A]
Für eine gute Maßnahme können wir die types
Serie umbenennen:
types.name = 'TYPE'
Was haben Sie müde ? – Merlin