pandas 基于多列的groupby,但保留其他列上重复次数最多的

pandas groupby based on multi-columns, but keep the most repeated duplicates number on other column

我有一个 table 下面的样子。

lon lat output
4050 -47.812224 -19.043365 1890.283215
5149 -47.812224 -19.043365 1890.283215
7316 -47.812224 -19.043365 1890.283215
8406 -47.812224 -19.043365 1890.283215
511 -47.812014 -19.007094 1813.785728
1555 -47.812014 -19.007094 1813.785728
3764 -47.812014 -19.007094 1821.363582
4846 -47.812014 -19.007094 1813.785728
29 -47.811177 -19.008053 1763.091936
1114 -47.811177 -19.008053 1763.091936
3262 -47.811177 -19.008053 1763.091936
4357 -47.811177 -19.008053 1763.091936
1436 -47.774424 -19.008700 2172.781911
2557 -47.774424 -19.008700 2174.394848
4725 -47.774424 -19.008700 2172.781911
5840 -47.774424 -19.008700 2172.781911
5211 -47.774166 -19.043847 2897.092502
6313 -47.774166 -19.043847 2897.092502
8460 -47.774166 -19.043847 2897.092502
9543 -47.774166 -19.043847 2897.092502
1679 -47.773958 -19.007574 2179.670924
2770 -47.773958 -19.007574 2179.670924
4998 -47.773958 -19.007574 2179.670924
6088 -47.773958 -19.007574 2179.670924
1937 -47.773121 -19.008533 2236.769862
3004 -47.773121 -19.008533 2236.769862
5231 -47.773121 -19.008533 2236.769862
6332 -47.773121 -19.008533 2236.769862

我想通过在 lonlat 上使用 groupby 来删除重复项,但在 [=25= 上保留重复次数最多的值]输出

例如

lon lat output
-47.812224 -19.043365 1890.283215
-47.812014 -19.007094 1813.785728
-47.811177 -19.008053 1763.091936
-47.774424 -19.008700 2172.781911
-47.774166 -19.043847 2897.092502
-47.773958 -19.007574 2179.670924
-47.773121 -19.008533 2236.769862

谁能告诉我怎么做?

您可以将 .groupbySeries.mode 结合使用:

x = df.groupby(["lon", "lat"])["output"].apply(lambda x: x.mode()[0])
print(x.reset_index())

打印:

         lon        lat       output
0 -47.812224 -19.043365  1890.283215
1 -47.812014 -19.007094  1813.785728
2 -47.811177 -19.008053  1763.091936
3 -47.774424 -19.008700  2172.781911
4 -47.774166 -19.043847  2897.092502
5 -47.773958 -19.007574  2179.670924
6 -47.773121 -19.008533  2236.769862

我们可以使用 .groupby 聚合方法来替代 Andrej 使用 .apply 并计算每一行的方法。

虽然它确实解决了我们的问题,但由于缺乏矢量化,.apply 方法对于大型数据集往往会变慢。

此外,reset_index 与 'inplace=True' 一起使用时速度更快。

%%timeit
df.groupby(['lat', 'lon']).agg(pd.Series.mode).reset_index(inplace=True)

希望对您有所帮助!!