根据列值自动移动数据框中的行

问题描述 投票:0回答:1

我有一个问题困扰了我一段时间,也是在智力上。我已经在论坛中收到了答案here,但我的印象是我这里还没有一个可以毫无错误地应用于每个数据集的解决方案。所以我想再试一次。

我有一个数据框

df

data = {
"latitude": [49.5659508, 49.568089, 49.5686342, 49.5687609, 49.5695834, 49.5706579, 49.5711228, 49.5716422, 49.5717749, 49.5619579, 49.5619579, 49.5628938, 49.5628938, 49.5630028, 49.5633175, 49.56397639999999, 49.566359, 49.56643220000001, 49.56643220000001, 49.5672061, 49.567729, 49.5677449, 49.5679685, 49.5679685, 49.5688543, 49.5690616, 49.5713705],
"longitude": [10.9873409, 10.9894035, 10.9896749, 10.9887881, 10.9851579, 10.9853273, 10.9912959, 10.9910182, 10.9867083, 10.9995758, 10.9995758, 11.000319, 11.000319, 10.9990996, 10.9993819, 11.004145, 11.0003023, 10.9999593, 10.9999593, 10.9935709, 11.0011213, 10.9954016, 10.9982288, 10.9982288, 10.9975928, 10.9931367, 10.9939141],
'Floor': [1,2,3, 1, 4, 2, 1, 2,3, 6, 6, 2, 2, 3, 2 ,2 ,4, 2, 2, 3, 2, 2, 2, 1, 1, 3, 2 ],
"cluster": [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2],

}
df = pd.DataFrame(data)


    latitude    longitude floor cluster
0   49.565951   10.987341   1   0
1   49.568089   10.989403   2   0
2   49.568634   10.989675   3   0
3   49.568761   10.988788   1   0
4   49.569583   10.985158   4   0

latitude
longitude
和“楼层”代表人的空间坐标。
cluster
列代表簇。每个集群的集群规模为 9 人。

我正在寻找一种自动方法将共享同一集群但具有完全相同坐标的人员移动到不同的集群中(见图)。在最好的情况下,新的簇值接近其原始值。没有“接近”的定义,但由于这些簇是由 k 最近邻组成的,因此它们反映了每个人与其他人的接近程度。因此,我的目标是避免将个体移离原来的集群太远,尽管这不是严格的限制。

理想情况下,我最终得到一个数据框,其中每个集群包含具有不同空间坐标的人(

latitude
longitude
floor
),并且每个集群恰好包含 9 行。如果出于某种原因这是不可能的,我希望最终得到带有数据框的集群,其中每个集群包含仅基于
latitude
longitude
具有不同空间坐标的人。

原始数据帧有 3k 行。因此我需要某种算法来完成这项工作。有什么想法吗?

python pandas dataframe algorithm while-loop
1个回答
0
投票

这就是你的意思?:

dups = df[df.duplicated(subset=['latitude','longitude', 'Floor'], keep='last')]
NonDups = df[~df.duplicated(subset=['latitude','longitude', 'Floor'], keep='last')]
dups['cluster'] = 9
df = pd.concat([dups,NonDups])
df
© www.soinside.com 2019 - 2024. All rights reserved.