在对python进行分组和排序后删除相似的数据

Posted

技术标签:

【中文标题】在对python进行分组和排序后删除相似的数据【英文标题】:removing similar data after grouping and sorting python 【发布时间】:2022-01-22 18:22:02 【问题描述】:

我有这些数据:

lat = [79.211, 79.212, 79.214, 79.444, 79.454, 79.455, 82.111, 82.122, 82.343, 82.231, 79.211, 79.444]
lon = [0.232,  0.232,  0.233,  0.233,  0.322,  0.323,  0.321,  0.321,  0.321,  0.411,  0.232,  0.233]
val = [2.113,  2.421,  2.1354, 1.3212, 1.452,  2.3553, 0.522,  0.521,  0.5421, 0.521,  1.321,  0.422]

df = pd.DataFrame("lat": lat, 'lon': lon, 'value':val)

我将它按 lat & lon 分组,然后按 value 列排序并取前 5 位,如下所示:

grouped = df.groupby(["lat", "lon"])
val_max = grouped['value'].max()
df_1 = pd.DataFrame(val_max)
df_1  = df_1.sort_values('value', ascending = False)[0:5]

我得到的输出是这样的:


                value
lat     lon 
79.212  0.232   2.4210
79.455  0.323   2.3553
79.214  0.233   2.1354
79.211  0.232   2.1130
79.454  0.322   1.4520

我想删除上述任何一项的最后一个小数位 1 以内的任何行。所以我们看到第 1 行与第 4 行的位置几乎相同,第 2 行与第 5 行的位置几乎相同,因此第 4 和第 5 将被下一个排名的 lat lon 替换,这将产生输出:

                value
lat     lon 
79.212  0.232   2.4210
79.455  0.323   2.3553
79.214  0.233   2.1354
82.343  0.321   0.5421
82.111  0.321   0.5220

请告诉我该怎么做。

【问题讨论】:

我认为您的意思是“行”,而不是“列”。如果在删除相似的行之后,你最终得到了另一对相似的行,你是否要删除它们? 谢谢,是的,我的意思是排。我已经改变了。是的,我也想删除它们。 @ThisFieldIsRequired 你知道怎么做吗? 如果不需要继续删除类似的,我想我会知道该怎么做。 能否请您告诉我该怎么做,然后我看看是否可以编辑它? 【参考方案1】:

您可以对数据框进行排序,如下所示:

grouped = df.groupby(["lat", "lon"])
val_max = grouped["value"].max()
df_1 = pd.DataFrame(val_max)
df_1 = (
    df_1.sort_values("value", ascending=False).reset_index().sort_values(["lat", "lon"])
)

然后,对每一行进行迭代并将其与前一行进行比较,找到并删除相似的行:

# Find similar rows and mark them in a new "match" column
df_1["match"] = ""
for i in range(df_1.shape[0] + 1):
    if i == 0:
        continue
    df_1.loc[
        (df_1.iloc[i, 0] - df_1.iloc[i - 1, 0] <= 0.001)
        | (df_1.iloc[i, 1] - df_1.iloc[i - 1, 1] <= 0.001),
        "match",
    ] = pd.NA

# Remove empty rows
df_1 = df_1.dropna(how="all").reset_index(drop=True)

# Remove unwanted rows and cleanup
index = [i - 1 for i in df_1[df_1["match"].isna()].index]
df_1 = df_1.drop(index=index).drop(columns="match").reset_index(drop=True)

哪些输出:

print(df_1)

      lat    lon   value
0  79.212  0.232  2.4210
1  79.214  0.233  2.1354
2  79.444  0.233  1.3212
3  79.455  0.323  2.3553
4  82.111  0.321  0.5220
5  82.122  0.321  0.5210
6  82.231  0.411  0.5210
7  82.343  0.321  0.5421

【讨论】:

以上是关于在对python进行分组和排序后删除相似的数据的主要内容,如果未能解决你的问题,请参考以下文章

关于sqlserver分组求和的问题

三、MySQL数据库之分组排序

Python分组

是否有代码对列中包含的相似单词进行分组

如何对DevExpress ASPxGridView进行分组排序

mySQL分组排序