为了账号安全,请及时绑定邮箱和手机立即绑定

多索引 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())


输出 

//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 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信