Python 在取消数据帧堆栈时避免对列进行排序

Python 在取消数据帧堆栈时避免对列进行排序,python,pandas,dataframe,Python,Pandas,Dataframe,当将pd.DataFrame从长格式解压为宽格式时,pandas会自动按升序对列进行排序。我怎样才能避免排序呢?当我手动对列重新排序时,我得到了预期的结果。然而,这不是最好的解决方案,不是吗 import pandas as pd df = pd.DataFrame( {"cols": ["B", "A", "C", "D"], "rows": [2, 1,

当将
pd.DataFrame
从长格式解压为宽格式时,pandas会自动按升序对列进行排序。我怎样才能避免排序呢?当我手动对列重新排序时,我得到了预期的结果。然而,这不是最好的解决方案,不是吗

import pandas as pd

df = pd.DataFrame(
    {"cols": ["B", "A", "C", "D"],
     "rows": [2, 1, 3, 4],
     "value": [3, 1, 2,4]})

df = df.set_index(["cols", "rows"], drop=True)
print(df)

           value
cols rows       
B    2         3
A    1         1
C    3         2
D    4         4

actual_result = df.unstack(level="cols").droplevel(level=0, axis=1)
print(actual_result)

cols    A    B    C    D
rows                    
1     1.0  NaN  NaN  NaN
2     NaN  3.0  NaN  NaN
3     NaN  NaN  2.0  NaN
4     NaN  NaN  NaN  4.0

expected_result = actual_result[["B", "A", "C", "D"]]
print(expected_result)

cols    B    A    C    D
rows                    
1     NaN  1.0  NaN  NaN
2     3.0  NaN  NaN  NaN
3     NaN  NaN  2.0  NaN
4     NaN  NaN  NaN  4.0

另一个类似于上一步中更改值的想法是在原始列中使用有序分类:

df["cols"] = pd.Categorical(df["cols"], ordered=True, categories=df["cols"].unique())
df = df.set_index(["cols", "rows"], drop=True)


actual_result = df.unstack(level="cols").droplevel(level=0, axis=1)
print(actual_result)
cols    B    A    C    D
rows                    
1     NaN  1.0  NaN  NaN
2     3.0  NaN  NaN  NaN
3     NaN  NaN  2.0  NaN
4     NaN  NaN  NaN  4.0
另一个想法是在
reindex
中使用原始列的唯一值:

df1 = df.set_index(["cols", "rows"], drop=True)
print(df1)


actual_result = (df1.unstack(level="cols")
                    .droplevel(level=0, axis=1)
                    .reindex(df["cols"].unique(), axis=1))
print(actual_result)
cols    B    A    C    D
rows                    
1     NaN  1.0  NaN  NaN
2     3.0  NaN  NaN  NaN
3     NaN  NaN  2.0  NaN
4     NaN  NaN  NaN  4.0
df1
中第一级的唯一值:

df1 = df.set_index(["cols", "rows"], drop=True)
print(df1)


actual_result = (df1.unstack(level="cols")
                    .droplevel(level=0, axis=1)
                    .reindex(df1.index.get_level_values(0).unique(), axis=1))
print(actual_result)

cols    B    A    C    D
rows                    
1     NaN  1.0  NaN  NaN
2     3.0  NaN  NaN  NaN
3     NaN  NaN  2.0  NaN
4     NaN  NaN  NaN  4.0

这确实是我所知道的最好的解决办法。对索引/列进行排序比不排序更有意义。另外,
df['value'].unsatchk('cols')
为您保存一个
droplevel
。如果
cols
已经是索引,这将非常痛苦。@QuangHoang-绝对同意;)我最喜欢你最后的建议。然而,在我看来,这并不像应该的那样直观。最好是
unstack
函数本身的输入参数。我在考虑类似于
sort=False