Python 多指标df的箱线图

Python 多指标df的箱线图,python,pandas,datetime,seaborn,multi-index,Python,Pandas,Datetime,Seaborn,Multi Index,我想做两件事: 我想为每个日期/天创建一个箱线图,其中包含该日期内MeanTravelTimeSeconds的所有值。MeanTravelTimeSeconds元素的数量因日期而异,例如,一天可能有300个值,而另一天可能有400个值 此外,我想将多重索引系列中的行转换为列,因为我不希望每次都重复这些行。如果它保持这样,我将有数千万不必要的行 以下是在按日期索引的df上使用df.stack后生成的系列。date是datetime对象索引: Date

我想做两件事:

我想为每个日期/天创建一个箱线图,其中包含该日期内MeanTravelTimeSeconds的所有值。MeanTravelTimeSeconds元素的数量因日期而异,例如,一天可能有300个值,而另一天可能有400个值

此外,我想将多重索引系列中的行转换为列,因为我不希望每次都重复这些行。如果它保持这样,我将有数千万不必要的行

以下是在按日期索引的df上使用df.stack后生成的系列。date是datetime对象索引:

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                           Tuesday
Length: 11281655, dtype: object
当我使用seaborn绘制箱线图时,在玩了不同的选择后,我发现了大量错误

如果我尝试执行df.stack.unstack或df.stack.T,则会出现以下错误:

Index contains duplicate entries, cannot reshape

如何绘制箱线图以及如何将行转换为列?

您确实需要使索引具有唯一性,才能使您想要使用的函数发挥作用。我建议使用一个序列号,在其他两个键列中每次更改时都会重置

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())

输出


我不明白你怎么会得到这样的数据框。你能提供模型数据吗,特别是检查一下我最初使用的是自动生成数字索引的普通df。我有一个名为“Date”的列,其中每一行都是datetime对象,每个日期重复多次,但其他列中的值与该日期相同。我是如何到达您询问的数据帧的:我后来做了什么,顺序是:1 df.set_index['Date']2 df.stack。您看到的每一行都是我的原始列。我想让它们以列的形式返回,但将日期保留在左边,保持现在的状态。有一个单一的日期为许多价值观。这是惊人的,我不能感谢你足够。明天我会仔细阅读,但快速阅读已经让我意识到这就是它。干杯
                                 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