/ / Wähle zwischen zwei Werten und setze die häufigsten in einem Pandas-Datenrahmen - Python, Pandas, Dataframe

Wähle zwischen zwei Werten und setze die am häufigsten verwendeten in einem Pandas-Datenrahmen - Python, Pandas, Dataframe

Ich habe gefragt Frage vor kurzem, aber jetzt habe ich ein neues Problem. Hier ist mein Datenrahmen:

df = pd.DataFrame({"id":[1,1,1,1,2,2,2,3,3,3,4,4],
"sex": [0,0,0,1,0,0,0,1,1,0,1,1]})

id  sex
0   1   0
1   1   0
2   1   0
3   1   1
4   2   0
5   2   0
6   2   0
7   3   1
8   3   1
9   3   0
10  4   1
11  4   1

Jetzt muss ich den Sexualwert für IDs mit gemischten Sexwerten einstellen. Es sollte der häufigste Wert sein. Also möchte ich etwas wie das bekommen:

    id  sex
0   1   0
1   1   0
2   1   0
3   1   0
4   2   0
5   2   0
6   2   0
7   3   1
8   3   1
9   3   1
10  4   1
11  4   1

Und danach möchte ich nur ein ID - Sex Paar bekommen:

id  sex
0   1   0
1   2   0
2   3   1
3   4   1

Antworten:

1 für die Antwort № 1

Sie dürfen verwenden np.bincount auch.

In [179]: df.groupby("id")["sex"].apply(lambda x: np.argmax(np.bincount(x))).reset_index()
Out[179]:
id  sex
0   1    0
1   2    0
2   3    1
3   4    1

Zeiten

In [194]: df = pd.concat([df]*1000, ignore_index=True)

In [195]: df.shape
Out[195]: (12000, 2)

In [196]: %timeit df.groupby("id")["sex"].apply(lambda x: np.argmax(np.bincount(x))).reset_index()
100 loops, best of 3: 2.48 ms per loop

In [197]: %timeit df.groupby("id")["sex"].apply(lambda x: x.value_counts().index[0]).reset_index()
100 loops, best of 3: 4.55 ms per loop

In [198]: %timeit df.set_index("id").groupby(level=0).sex.apply(lambda x: x.value_counts().idxmax()).reset_index()
100 loops, best of 3: 6.71 ms per loop

1 für die Antwort № 2

Option 1
Sie können verwenden groupby gefolgt von value_counts und idxmax.

df = df.set_index("id").groupby(level=0).sex
.apply(lambda x: x.value_counts().idxmax()).reset_index()
df

id  sex
0   1    0
1   2    0
2   3    1
3   4    1

Option 2
Ähnlich zu Option 1, aber in 2 Schritten, mit drop_duplicates

df.sex = df.groupby("id").sex.transform(lambda x: x.value_counts().idxmax())
df

id  sex
0    1    0
1    1    0
2    1    0
3    1    0
4    2    0
5    2    0
6    2    0
7    3    1
8    3    1
9    3    1
10   4    1
11   4    1

df = df.drop_duplicates()
df

id  sex
0    1    0
4    2    0
7    3    1
10   4    1

1 für die Antwort № 3

Benutzen groupby mit value_counts welche standardmäßig sortiert wird, so wird nur der erste Index ausgewählt [0]:

df = df.groupby("id")["sex"].apply(lambda x: x.value_counts().index[0]).reset_index()
print (df)
id  sex
0   1    0
1   2    0
2   3    1
3   4    1