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
。