Pandas nlargest with NaN inside my data return 多于n行数据
Pandas nlargest with NaN inside my data return more than n rows of data
我有 DataFrame
看起来像这样:
Name Score1 Score2 Score3
0 A 98 72 99
1 A 98 84 91
2 B 34 20 81
3 A 98 93 88
4 B 68 97 12
5 A NaN 72 NaN
我要groupby
取名,然后在Score1
上取前2,如果重复值,则看Score2
取大的。期望值:
Name Score1 Score2 Score3
0 A 98 93 88
1 A 98 84 91
2 B 68 97 12
3 B 34 20 81
我试过了df.groupby("Name").apply(lambda x:x.nlargest(2, ["Score1", "Score2"])).reset_index(drop=True)
。我得到的是:
Name Score1 Score2 Score3
0 A 98 93 88
1 A 98 84 91
2 A 98 72 99
3 A NaN 72 NaN
4 B 68 97 12
5 B 34 20 81
我发现由于 NaN
,它 returns 我 Name A
多了 2 行数据。 dropna
是修复它的唯一方法吗?
你也可以这样做:
out = df.sort_values(['Score1', 'Score2'], ascending=False).groupby('Name').head(2)
print(out)
Name Score1 Score2 Score3
3 A 98.0 93 88.0
1 A 98.0 84 91.0
4 B 68.0 97 12.0
2 B 34.0 20 81.0
您可以在使用 nlargest 之前尝试填充 nan 或删除它们。
cols = ["Score1", "Score2"]
df[cols] = df[cols].fillna()
#df = df.dropna(subset=columns)
out = df.groupby("Name").apply(lambda g: g.nlargest(2, cols)).reset_index(drop=True)
我有 DataFrame
看起来像这样:
Name Score1 Score2 Score3
0 A 98 72 99
1 A 98 84 91
2 B 34 20 81
3 A 98 93 88
4 B 68 97 12
5 A NaN 72 NaN
我要groupby
取名,然后在Score1
上取前2,如果重复值,则看Score2
取大的。期望值:
Name Score1 Score2 Score3
0 A 98 93 88
1 A 98 84 91
2 B 68 97 12
3 B 34 20 81
我试过了df.groupby("Name").apply(lambda x:x.nlargest(2, ["Score1", "Score2"])).reset_index(drop=True)
。我得到的是:
Name Score1 Score2 Score3
0 A 98 93 88
1 A 98 84 91
2 A 98 72 99
3 A NaN 72 NaN
4 B 68 97 12
5 B 34 20 81
我发现由于 NaN
,它 returns 我 Name A
多了 2 行数据。 dropna
是修复它的唯一方法吗?
你也可以这样做:
out = df.sort_values(['Score1', 'Score2'], ascending=False).groupby('Name').head(2)
print(out)
Name Score1 Score2 Score3
3 A 98.0 93 88.0
1 A 98.0 84 91.0
4 B 68.0 97 12.0
2 B 34.0 20 81.0
您可以在使用 nlargest 之前尝试填充 nan 或删除它们。
cols = ["Score1", "Score2"]
df[cols] = df[cols].fillna()
#df = df.dropna(subset=columns)
out = df.groupby("Name").apply(lambda g: g.nlargest(2, cols)).reset_index(drop=True)