有没有办法使用用户定义的列表对数据框的列进行重新排序?

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 有效):

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