Wenn benötigen Ausgang 1
und 0
nur auf das Vorhandensein von value
:
Sie get_dummies
mit Series
von set_index
erstellt verwenden können, aber dann notwendig ist, groupby
+ GroupBy.max
:
df = pd.get_dummies(df.set_index(['id1','id2'])['value'])
.groupby(level=[0,1])
.max()
.reset_index()
print (df)
id1 id2 a b c d
0 1 1 1 1 1 1
1 2 2 1 1 1 0
Eine andere Lösung mit groupby
, size
und unstack
, aber dann ist erforderlich mit gt
vergleichen und zu int
von astype
konvertieren. Letzte reset_index
und rename_axis
:
df = df.groupby(['id1','id2', 'value'])
.size()
.unstack(fill_value=0)
.gt(0)
.astype(int)
.reset_index()
.rename_axis(None, axis=1)
print (df)
id1 id2 a b c d
0 1 1 1 1 1 1
1 2 2 1 1 1 0
Wenn Bedarf zählen value
s:
df = pd.DataFrame({'id1':[1,1,1,1,2,2,2],
'id2':[1,1,1,1,2,2,2],
'value':['a','b','a','d','a','b','c']})
print (df)
id1 id2 value
0 1 1 a
1 1 1 b
2 1 1 a
3 1 1 d
4 2 2 a
5 2 2 b
6 2 2 c
df = df.groupby(['id1','id2', 'value'])
.size()
.unstack(fill_value=0)
.reset_index()
.rename_axis(None, axis=1)
print (df)
id1 id2 a b c d
0 1 1 2 1 0 1
1 2 2 1 1 1 0
Oder:
df = df.pivot_table(index=['id1','id2'], columns='value', aggfunc='size', fill_value=0)
.reset_index()
.rename_axis(None, axis=1)
print (df)
id1 id2 a b c d
0 1 1 2 1 0 1
1 2 2 1 1 1 0
Wenn '2 1 1 c 'auf' geändert 2 1 1 a' was wird ausgegeben? – jezrael
Sorry für Verwirrung. Ich werde nur eine Instanz von jedem Wert haben. bedeutet, für jede ID wird es nur ein "a" geben. Ich muss nur das Vorhandensein mit binären Werten überprüfen. Id1 und ID2 werden genau gleich sein. –
Ok, also die ersten 2 Lösungen sind für dich. – jezrael