Ich möchte so etwas bekommen.

A
1
1
2
3
3
4
4
4
4

Ich möchte es schaffen

A   B
1   2
1   2
2   1
3   2
3   2
4   4
4   4
4   4
4   4

Wie Sie hier sehen, sind die Schlüssel dupliziert und befinden sich immer noch in derselben Reihenfolge wie das Original.

Ich weiß, wie man diese Aufgabe in R mithilfe von data.table erledigt, und ich weiß nur, wie man groupby verwendet, um eindeutige Schlüsselzahlen in Pandas zu erhalten.

Hat jemand Ideen?

Vielen Dank!

0
Eleanor 18 Apr. 2018 im 03:24

4 Antworten

Beste Antwort

Sie können dies verwenden:

import pandas as pd

df = pd.DataFrame({
    'A' : [1, 1, 2, 3, 3, 4, 4, 4, 4]
})
df['B'] = df.groupby(['A'])['A'].transform('count')

print(df)

Ausgabe:

   A  B
0  1  2
1  1  2
2  2  1
3  3  2
4  3  2
5  4  4
6  4  4
7  4  4
8  4  4
5
rafaelc 18 Apr. 2018 im 03:01

Sie können ein groupby verwenden und zusammenführen:

df = pd.DataFrame({'A' : [1, 1, 2, 3, 3, 4, 4, 4, 4]})

df = df.merge(df.groupby('A').size().reset_index(), on='A')

Welches wird Ihnen geben:

   A  0
0  1  2
1  1  2
2  2  1
3  3  2
4  3  2
5  4  4
6  4  4
7  4  4
8  4  4
3
Simon 18 Apr. 2018 im 00:35

Schneller Weg mit pd.factorize und np.bincount

f = df.A.factorize()[0]
df.assign(B=np.bincount(f)[f])

   A  B
0  1  2
1  1  2
2  2  1
3  3  2
4  3  2
5  4  4
6  4  4
7  4  4
8  4  4

Erläuterung

pd.factorize erstellt ein Array von Ganzzahlen, wobei jede Ganzzahl einen eindeutigen Wert im faktorisierten Array darstellt. Diese ganzen Zahlen beginnen bei Null.

f

array([0, 0, 1, 2, 2, 3, 3, 3, 3])

np.bincount verwendet jeden Wert in einem Array von Ganzzahlen und zählt, wie oft diese Ganzzahl gesehen wurde. Wenn wir diese Ganzzahlen als Bins betrachten, zählen wir, wie oft auf jeden Bin verwiesen wird.

np.bincount(f)

array([2, 1, 2, 4])

Schließlich verwenden wir f, um diese Zählungen aufzuteilen und uns die Zählungen zurückzugeben, die für jedes Mal wiederholt wurden, wenn auf den Behälter verwiesen wurde.

np.bincount(f)[f]

array([2, 2, 1, 2, 2, 4, 4, 4, 4])
2
piRSquared 18 Apr. 2018 im 01:03

Verwenden von map mit groupby size

df['B']=df.A.map(df.groupby('A').size())
df
Out[630]: 
   A  B
0  1  2
1  1  2
2  2  1
3  3  2
4  3  2
5  4  4
6  4  4
7  4  4
8  4  4
2
YOBEN_S 18 Apr. 2018 im 01:41