pandas 如何透视表以使用列标题作为值并使用唯一值作为列标题?

z0qdvdin  于 2023-06-28  发布在  其他
关注(0)|答案(1)|浏览(104)

我有下表:
| 索引|第一天|第二天|第三天|
| - -----|- -----|- -----|- -----|
| 0|- -一种|星期一|星期二|
| 一个|星期五|星期六|星期天|
| 2|星期天|星期一|- -一种|
| 三个|星期二|星期三|- -一种|
| 4|星期四|星期五|星期六|
我现在要做的是切换列标题,使用它们作为值,并使用唯一的单元格值作为新的列标题。这应该会产生一个像这样的稀疏表:
| 索引|- -一种|星期一|星期二|星期三|星期四|星期五|星期六|星期天|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 0|第一天|第二天|第三天|- -----|- -----|- -----|- -----|- -----|
| 一个|- -----|- -----|- -----|- -----|- -----|第一天|第二天|第三天|
| 2|第二天|- -一种|- -----|- -----|- -----|- -----|- -----|第一天|
| 三个|...||||||||
| 4|...||||||||
有人能帮我做到这一点吗?
我试过了:df. pivot_table(index = df. index,columns = df. values,values = df. columns)
但没成功。

tpgth1q7

tpgth1q71#

你的想法是正确的,但在旋转之前需要更多的操作:

day_order = ["-", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]

df.set_index("Index").stack().reset_index()\
    .pivot(index="Index", columns=0, values="level_1")\
        .reindex(day_order, axis=1)
# Out[]: 
# 0              -      Monday    Tuesday  ...      Friday    Saturday     Sunday
# Index                                    ...                                   
# 0      First Day  Second Day  Third Day  ...         NaN         NaN        NaN
# 1            NaN         NaN        NaN  ...   First Day  Second Day  Third Day
# 2      Third Day  Second Day        NaN  ...         NaN         NaN  First Day
# 3      Third Day         NaN  First Day  ...         NaN         NaN        NaN
# 4            NaN         NaN        NaN  ...  Second Day   Third Day        NaN

# [5 rows x 8 columns]

1.这将索引设置为Index,然后进行堆栈,这样您就有了一个包含Index和First/Second/Third Days的MultiIndex。
1.重置索引会将这些列放回原来的位置(因此现在有3列索引,Days和day of the week。
1.然后你就可以用这些柱子来旋转了。
1.最后,将值按工作日顺序排序。

编辑:

  • ValueError: Index contains duplicate entries, cannot reshape. * 的替代解决方案

您可以尝试使用groupbyunstack而不是pivot,以消除此错误:

df.set_index("Index").stack().reset_index() \
    .groupby(["Index", 0])["level_1"].first().unstack() \
        .reindex(day_order, axis=1)

相关问题