亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

多索引 df 的箱線圖

多索引 df 的箱線圖

繁星淼淼 2023-06-27 13:31:03
我想做兩件事:我想為每個日期/天創建一個箱線圖,其中包含該日期中 MeanTravelTimeSeconds 的所有值。MeanTravelTimeSeconds 元素的數量隨日期而變化(例如,某一天可能有 300 個值,而另一天可能有 400 個)。另外,我想將多索引系列中的行轉換為列,因為我不希望每次都重復行。如果它保持這樣,我就會有數千萬不必要的行。這是在按日期索引的 df 上使用 df.stack() 后的結果系列(日期是日期時間對象索引):Date                                        2016-01-02  NumericIndex                        1611664            OriginMovementID                       4744            DestinationMovementID                  5084            MeanTravelTimeSeconds                  1233            RangeLowerBoundTravelTimeSeconds        756                                                 ...   2020-03-31  DestinationMovementID                  3594            MeanTravelTimeSeconds                  1778            RangeLowerBoundTravelTimeSeconds       1601            RangeUpperBoundTravelTimeSeconds       1973            DayOfWeek                           TuesdayLength: 11281655, dtype: object當我使用seaborn繪制箱線圖時,在使用不同的選擇后,我遇到了很多錯誤。如果我嘗試這樣做df.stack().unstack()或df.stack().T收到以下錯誤:Index contains duplicate entries, cannot reshape如何繪制箱線圖以及如何將行轉換為列?
查看完整描述

1 回答

?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

您確實需要使您的索引獨一無二,以使您想要的功能發揮作用。我建議在其他兩個關鍵列中每次更改時都會重置一個序列號。


import datetime as dt

import random

import numpy as np

cat = ["NumericIndex","OriginMovementID","DestinationMovementID","MeanTravelTimeSeconds",

 "RangeLowerBoundTravelTimeSeconds"]


df = pd.DataFrame(

[{"Date":d, "Observation":cat[random.randint(0,len(cat)-1)], 

  "Value":random.randint(1000,10000)} 

 for i in range(random.randint(5,20)) 

 for d in pd.date_range(dt.datetime(2016,1,2), dt.datetime(2016,3,31), freq="14D")])


# starting point....

df = df.sort_values(["Date","Observation"]).set_index(["Date","Observation"])


# generate an array that is sequential within change of key

seq = np.full(df.index.shape, 0)

s=0

p=""

for i, v in enumerate(df.index):

    if i==0 or p!=v: s=0

    else: s+=1

    seq[i] = s

    p=v

df["SeqNo"] = seq

# add to index - now unstack works as required

dfdd = df.set_index(["SeqNo"], append=True)

dfdd.unstack(0).loc["MeanTravelTimeSeconds"].boxplot()

print(dfdd.unstack(1).head().to_string())


輸出 

http://img1.sycdn.imooc.com//649a74670001700f04450245.jpg

                                 Value                                                                                     

Observation      DestinationMovementID MeanTravelTimeSeconds NumericIndex OriginMovementID RangeLowerBoundTravelTimeSeconds

Date       SeqNo                                                                                                           

2016-01-02 0                       NaN                   NaN       2560.0           5324.0                           5085.0

           1                       NaN                   NaN       1066.0           7372.0                              NaN

2016-01-16 0                       NaN                6226.0          NaN           7832.0                              NaN

           1                       NaN                1384.0          NaN           8839.0                              NaN

           2                       NaN                7892.0          NaN              NaN                              NaN



查看完整回答
反對 回復 2023-06-27
  • 1 回答
  • 0 關注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號