如何在熊猫中用数字对字符串排序?

时间:2018-08-01 15:08:36

标签: python python-3.x pandas sorting

我有一个Python Pandas Dataframe,其中名为status的列包含三种可能的值:okmust read x more booksdoes not read any books yet,其中{{1} }是大于x的整数。

我想根据上面的顺序对0值进行排序。

示例:

status

我使用Pandas Categoricalmap找到了一些有趣的提示,但我不知道如何处理修改字符串的变量值。

我该如何实现?

2 个答案:

答案 0 :(得分:7)

使用:

a = df['status'].str.extract('(\d+)', expand=False).astype(float)

d = {'ok': a.max() + 1, 'does not read any book yet':-1}

df1 = df.iloc[(-df['status'].map(d).fillna(a)).argsort()]
print (df1)
     name                      status
0    Paul                          ok
2  Robert      must read 2 more books
1    Jean      must read 1 more books
3    John  does not read any book yet

说明

  1. regex \d+开头的extract个整数
  2. 然后为map个非数字值动态创建dictionary
  3. fillna替换NaN的{​​{1}}
  4. 通过argsort获取职位
  5. iloc选择排序值

答案 1 :(得分:2)

您可以将sorted与自定义函数一起使用,以计算对数组进行排序的索引(非常类似于numpy.argsort)。然后输入pd.DataFrame.iloc

df = pd.DataFrame({'name': ['Paul', 'Jean', 'Robert', 'John'],
                   'status': ['ok', 'must read 20 more books',
                              'must read 3 more books', 'does not read any book yet']})

def sort_key(x):
    if x[1] == 'ok':
        return -1
    elif x[1] == 'does not read any book yet':
        return np.inf
    else:
        return int(x[1].split()[2])

idx = [idx for idx, _ in sorted(enumerate(df['status']), key=sort_key)]

df = df.iloc[idx, :]

print(df)

     name                      status
0    Paul                          ok
2  Robert      must read 3 more books
1    Jean     must read 20 more books
3    John  does not read any book yet