Python 3.x 如何根据条件对数据帧的行值进行排序?
我有以下数据框Python 3.x 如何根据条件对数据帧的行值进行排序?,python-3.x,pandas,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', '
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")
非常感谢您的帮助 为什么不简单
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
据我所知,您可能希望groupby,然后将需要排序的列转换为,然后:
很好,我正在考虑将df转换为dict,然后对sorted类使用自定义排序,但这是better@Datanovice这遵循一个相似的逻辑,但没有什么不同。谢谢:
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