按列表大小而不是A-Z对熊猫数据框进行排序

时间:2018-10-18 20:38:26

标签: python pandas

我有一个看起来像这样的数据框:

username          group
user1             [A]
user2             [B, C]
user3             [A, B, C]
user4             [A, B]

我希望结果看起来像这样:

username          group
user3             [A, B, C]
user4             [A, B]
user2             [B, C]
user1             [A]

我已经查看了有关sort_values的文档,它似乎主要涵盖了0-9或A-Z排序。.预先感谢

4 个答案:

答案 0 :(得分:7)

一种方法是使用长度创建一个新列,然后按其排序:

df['len'] = df['group'].str.len()
df.sort_values(by='len', ascending=False).drop(columns='len')

输出为:

    group       
2   (A, B, C)   
1   (B, C)      
3   (A, B)      
0   (A,)        

答案 1 :(得分:3)

只需将它丢掉作为选择:

template <typename, typename...>
struct OneOf;

template <typename T0, typename T1, typename ... Ts>
struct OneOf<T0, T1, Ts...> {
    union {
        T0 value;
        OneOf<T1, Rest...> rest;
    };
};

template <typename T0>
struct OneOf<T0> {
    T0 value;
};

答案 2 :(得分:0)

您可以尝试在数据框中添加一列,以存储列表的长度,然后进行排序:

import pandas as pd

df = pd.DataFrame(data={"A": [[0, 1], [3], [1, 4, 5]]})
#            A
# 0     [0, 1]
# 1        [3]
# 2  [1, 4, 5]

df["Length"] = df["A"].str.len()

df.sort_values("Length", ascending=False)
#            A  Length
# 2  [1, 4, 5]       3
# 0     [0, 1]       2
# 1        [3]       1

如果您不再需要Length列,则可以将其删除:

df.sort_values("Length", inplace=True, ascending=False)
del df["Length"]

结果:

           A
2  [1, 4, 5]
0     [0, 1]
1        [3]

答案 3 :(得分:0)

使用 keyssort_values 的更温和的方式

df.sort_values(by='group', key=lambda x: x.str.len(), ascending=False)

示例:

df = pd.DataFrame(data={"A": [[0, 1], [3], [1, 4, 5]]})
df

    A
0   [0, 1]
1   [3]
2   [1, 4, 5]

df.sort_values(by="A",  key=lambda x: x.str.len(), ascending=False)

    A
2   [1, 4, 5]
0   [0, 1]
1   [3]