按值对带有字典的 pandas 数据框进行排序

Sort a pandas dataframe with dicts by values

我正在尝试对 pandas 数据框进行排序。每个单元格都是两个值的字典。一列示例:

0        {'lat': 50.7392927, 'lon': 7.0950485}
1        {'lat': 51.423369, 'lon': 7.1495216}
2        {'lat': 50.7385629, 'lon': 7.0938597}
3        {'lat': 50.7394781, 'lon': 7.1001448}
4        {'lat': 52.2092612, 'lon': 8.7446132}

我试图通过遍历框架对每一列进行排序,但是当我什至尝试使用以下代码对单个列进行排序时:

sorted(df["name"], key=lambda d:d["lat"])

我收到 错误:'float' 对象不可订阅

编辑: 我想要实现的输出是按键“lat”的值排序的列:

0        {'lat': 50.7385629, 'lon': 7.0938597}
1        {'lat': 50.7392927, 'lon': 7.0950485}
2        {'lat': 50.7394781, 'lon': 7.1001448}
3        {'lat': 51.423369, 'lon': 7.1495216}
4        {'lat': 52.2092612, 'lon': 8.7446132}

我的猜测是,这只是 returns 一个浮点数,而不是可以排序的浮点数列表。我当然可以遍历整个 Dataframe 并构建一个包含每一列的列表来对其进行排序,但我认为可能会有更好更快的解决方案。

此致

如果你有这个 DataFrame:

    name                               position
0   john  {'lat': 50.7392927, 'lon': 7.0950485}
1   rick   {'lat': 51.423369, 'lon': 7.1495216}
2  jenny  {'lat': 50.7385629, 'lon': 7.0938597}
3   mick  {'lat': 50.7394781, 'lon': 7.1001448}
4  peter  {'lat': 52.2092612, 'lon': 8.7446132}

然后您可以按 "position" 列 - "lat" 键排序(假设您在列中创建了 Python 字典,而不是字符串):

df = df.sort_values(by="position", key=lambda k: k.str["lat"])
print(df)

打印:

    name                               position
2  jenny  {'lat': 50.7385629, 'lon': 7.0938597}
0   john  {'lat': 50.7392927, 'lon': 7.0950485}
3   mick  {'lat': 50.7394781, 'lon': 7.1001448}
1   rick   {'lat': 51.423369, 'lon': 7.1495216}
4  peter  {'lat': 52.2092612, 'lon': 8.7446132}

另一种方法:

print(df.iloc[sorted(df.index, key=lambda k: df.loc[k, "position"]["lat"])])

也许您还可以 transpose 数据框并使用 sort_values 按 'lat' 列排序(可选:并将 transpose 应用于 return为原始)

代码:

#given dictionaries
a = {'lat': 50.7392927, 'lon': 7.0950485}
b = {'lat': 51.423369, 'lon': 7.1495216}
c = {'lat': 50.7385629, 'lon': 7.0938597}
d = {'lat': 50.7394781, 'lon': 7.1001448}
e = {'lat': 52.2092612, 'lon': 8.7446132}

df = pd.DataFrame({'1':pd.Series(a),
              '2':pd.Series(b),
              '3':pd.Series(c),
              '4':pd.Series(d),
              '5':pd.Series(e)})

#transposing rows and columns
df= df.transpose()

#sorting values by lat columns
df.sort_values('lat', ascending= False)

结果: