按值对带有字典的 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)
结果:
我正在尝试对 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)
结果: