有没有办法使用用户定义的列表对数据框的列进行重新排序?
Is there a way to reorder a dataframe's column using a user defined list?
各位大侠您好!
我目前正在做一个项目,我必须使用 pandas 处理二维数组(由于我无法解释的原因,numpy 在上下文中是不可能的)。
我有一个看起来像这样的数据框:
pd.DataFrame(
{
'some_id': [0, 0, 0, 0,
1, 1, 1, 1,
2, 2, 2, 2],
'some_name': ['a', 'b', 'c', 'd',
'a', 'b', 'c', 'd',
'a', 'b', 'c', 'd']
})
这会产生类似这样的结果:(example initial dataframe)
现在我的问题是:
我想将给定列中的所有行与另一组行交换。例如,我想将“some_id”顺序更改为 [2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0]
而不会丢失其他列中的顺序。基本上,我想将一个行列表与另一个行列表交换。这将是 result after swapping 使用本段中列表的初始数据框。
我还想提一下,包含相同值的元素的数量可能不同。所以初始数据帧可能看起来 like so.
这是我到目前为止尝试过的方法(none 有效):
- pd.sort_values() --> 无效,因为您无法传递自定义订单列表。
temp_val = df.loc[df['some_id'] == 0]
df.loc[df['some_id'] == 0] = df.loc[df['some_id'] == 1]
df.loc[df['some_id'] == 1] = temp_val
此解决方案似乎可以找到正确的行。但是,它无法交换行并在整行上创建 'NaN' 值。
我很抱歉张贴了这么多图片。我没有想法,时间 运行 在我这边。谢谢大家!
您可以使用自定义键按顺序映射您想要的值,并使用稳定排序保持其余未排序:
order = [2,1,0]
df2 = df.sort_values(by='some_id', kind='stable',
key=lambda s: s.map({k:v for v,k in enumerate(order)}))
输出:
some_id some_name
8 2 a
9 2 b
10 2 c
11 2 d
4 1 a
5 1 b
6 1 c
7 1 d
0 0 a
1 0 b
2 0 c
3 0 d
各位大侠您好!
我目前正在做一个项目,我必须使用 pandas 处理二维数组(由于我无法解释的原因,numpy 在上下文中是不可能的)。
我有一个看起来像这样的数据框:
pd.DataFrame(
{
'some_id': [0, 0, 0, 0,
1, 1, 1, 1,
2, 2, 2, 2],
'some_name': ['a', 'b', 'c', 'd',
'a', 'b', 'c', 'd',
'a', 'b', 'c', 'd']
})
这会产生类似这样的结果:(example initial dataframe)
现在我的问题是:
我想将给定列中的所有行与另一组行交换。例如,我想将“some_id”顺序更改为 [2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0]
而不会丢失其他列中的顺序。基本上,我想将一个行列表与另一个行列表交换。这将是 result after swapping 使用本段中列表的初始数据框。
我还想提一下,包含相同值的元素的数量可能不同。所以初始数据帧可能看起来 like so.
这是我到目前为止尝试过的方法(none 有效):
- pd.sort_values() --> 无效,因为您无法传递自定义订单列表。
temp_val = df.loc[df['some_id'] == 0]
df.loc[df['some_id'] == 0] = df.loc[df['some_id'] == 1]
df.loc[df['some_id'] == 1] = temp_val
此解决方案似乎可以找到正确的行。但是,它无法交换行并在整行上创建 'NaN' 值。
我很抱歉张贴了这么多图片。我没有想法,时间 运行 在我这边。谢谢大家!
您可以使用自定义键按顺序映射您想要的值,并使用稳定排序保持其余未排序:
order = [2,1,0]
df2 = df.sort_values(by='some_id', kind='stable',
key=lambda s: s.map({k:v for v,k in enumerate(order)}))
输出:
some_id some_name
8 2 a
9 2 b
10 2 c
11 2 d
4 1 a
5 1 b
6 1 c
7 1 d
0 0 a
1 0 b
2 0 c
3 0 d