如何根据条件对熊猫数据框的行值进行排序?

时间:2020-01-24 14:36:14

标签: python-3.x pandas

我有以下数据框

df = pd.DataFrame([['1','aa', 'fff'], ['1', 'aa', 'ggg'], ['1', 'aa', 'eee'],
           ['2','aa', 'eee'], ['2', 'aa', 'ggg'], ['2', 'aa', 'fff'],
           ['3','bb', 'hhh'], ['3', 'bb', 'mmm'], ['3', 'bb', 'kkk'],
           ['3', 'bb', 'jjj'], ['4','bb', 'kkk'], ['4', 'bb', 'mmm'],
           ['4', 'bb', 'hhh'], ['4', 'bb', 'jjj'], ['5','aa', 'ggg'],
           ['5', 'aa', 'eee'], ['5', 'aa', 'fff']], columns=['foo', 'bar','name_input'])

现在,我需要根据条件对“名称输入”列中的值进行排序。 条件是

  • 对于bar == aa,然后是行值== ['eee','fff','ggg'],对于bar == bb,则是行值== ['hhh','jjj','kkk ','mmm']

最后,我的目标是输出以下内容

df = pd.DataFrame([['1','aa', 'eee'], ['1', 'aa', 'fff'], ['1', 'aa', 'ggg'],
           ['2','aa', 'eee'], ['2', 'aa', 'fff'], ['2', 'aa', 'ggg'],
           ['3','bb', 'hhh'], ['3', 'bb', 'jjj'], ['3', 'bb', 'kkk'],
           ['3', 'bb', 'mmm'], ['4','bb', 'hhh'], ['4', 'bb', 'jjj'],
           ['4', 'bb', 'kkk'], ['4', 'bb', 'mmm'], ['5','aa', 'eee'],
           ['5', 'aa', 'fff'], ['5', 'aa', 'ggg']], columns=['foo', 'bar','name_input'])

我尝试按行对索引重新排序。但是,它似乎不起作用。

df = df.pivot(index="foo", columns="bar", values="name_input")

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

据我了解,您可能希望进行分组,然后将所需(要排序的 )列转换为categorical,然后转换为sort_values

d = {'aa':['eee', 'fff', 'ggg'],'bb':['hhh' ,'jjj', 'kkk','mmm']} #dict of the conditions

final = pd.concat(g.reset_index().assign(name_input = 
            pd.Categorical(g.reset_index()['name_input'],d.get(i),ordered=True))
           .sort_values('name_input') for i,g in 
           df.set_index('name_input').groupby(['foo','bar'])).reindex(df.columns,axis=1)

  foo bar name_input
2   1  aa        eee
0   1  aa        fff
1   1  aa        ggg
0   2  aa        eee
2   2  aa        fff
1   2  aa        ggg
0   3  bb        hhh
3   3  bb        jjj
2   3  bb        kkk
1   3  bb        mmm
2   4  bb        hhh
3   4  bb        jjj
0   4  bb        kkk
1   4  bb        mmm
1   5  aa        eee
2   5  aa        fff
0   5  aa        ggg

答案 1 :(得分:0)

为什么不简单

from pandas.util.testing import assert_frame_equal

dt = df.sort_values(by=['foo', 'bar', 'name_input']).reset_index().drop('index', axis=1, inplace=False)

try:
    assert_frame_equal(dt, df)
    print("True")
except:  
    print("False")

>>>True