pandas - 使用列表列对 Pandas DataFrame 进行排序
问题描述
我有一个从这样的数据透视表创建的数据框:
我的钥匙 | 价值观1 | 价值观2 | 价值观3 |
---|---|---|---|
1 | [1,2,0] | [2,3,5] | [2,3,4] |
3 | [2,1] | [3,1] | [2,1] |
我想按 values1 升序对数据框中的列表进行排序,并将该排序反映在 values2 和 values3 的排序中,如下所示:
我的钥匙 | 价值观1 | 价值观2 | 价值观3 |
---|---|---|---|
1 | [0,1,2] | [5,2,3] | [4,2,3] |
3 | [1,2] | [1,3] | [1,2] |
现在,我在创建数据透视表之前对数组的输入值进行了排序,这似乎可行,但我认为在创建数据透视表后可能会有一种方法来对数据进行排序。
解决方案
您可以同时将所有列df.apply(pd.Series.explode)
分解为更长的数据框以准备排序。然后,.groupby
回到一个列表,现在按所需的顺序:
import pandas as pd
df = pd.DataFrame({'mykey' : [1, 3],
'values1' : [[1,2,0], [2,1]],
'values2' : [[2,3,5], [3,1]],
'values3' : [[2,3,4], [2,1]]})
df = (df.apply(pd.Series.explode)
.reset_index()
.sort_values(['mykey', 'values1'])
.drop('index', axis=1)
.groupby('mykey') # Passing 'sort=False' could have a minor performance boost even though already sorted.
.agg(list)
.reset_index())
df
Out[1]:
mykey values1 values2 values3
0 1 [0, 1, 2] [5, 2, 3] [4, 2, 3]
1 3 [1, 2] [1, 3] [1, 2]
推荐阅读
- c# - EF Core Generic Context.Find 用于 CRUD(创建/检索/更新/删除)视图
- git - 了解 git rev-list
- python - Python 将数据框转换为系列。显示重复的列名
- angular - 如果第一个 Angular,将模板引用变量属性添加到元素
- java - 使用布尔值进行 DynamoDB 映射器类型转换
- java - 如何在不停止循环的情况下创建在循环中的某个点触发的输出?
- xml - 如何将 System.Xml.XmlElement 作为自定义 powershell 函数的管道参数传递?
- javascript - InfiniteScroll + isotope : loadNextPage 直到项目数大于 3
- java - 为什么我的计时器在我停止时会导致我的 android 活动崩溃?
- r - 添加 Heatmaply 热图列的平均值作为其附近的注释