【问题标题】:Pandas - Create columns from column value, and fill with countPandas - 从列值创建列,并填充计数
【发布时间】:2018-09-28 13:01:34
【问题描述】:

我有一个类似于下面的数据框。

Index Time Weekday 0 21:10:00 Tuesday 1 21:15:00 Tuesday 2 21:20:00 Tuesday 3 21:20:00 Tuesday 4 21:25:00 Wednesday 5 21:25:00 Wednesday 6 21:30:00 Friday 7 21:35:00 Thursday 8 21:35:00 Wednesday 9 21:40:00 Wednesday 10 21:40:00 Wednesday 11 21:40:00 Monday

我想把工作日分列,并计算每天出现的次数,我的目标是这样的:

Time Monday Tuesday Wednesday Thursday Friday 21:10:00 0 1 0 0 0 21:15:00 0 1 0 0 0 21:20:00 0 2 0 0 0 21:25:00 0 0 2 0 0 21:30:00 0 0 0 0 1 21:35:00 0 0 1 1 0 21:40:00 1 0 2 0 0

这样做的原因是因为我想在 seaborn 中创建一个热图,并且我读取的数据必须以某种方式旋转/成形: https://stackoverflow.com/a/37790707/9384889

我知道如何计算每个 Time 值出现的频率,忽略工作日: df['Time'].value_counts() 我一直在阅读http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.pivot.html 但我看不出如何将这两个想法结合起来。

【问题讨论】:

    标签: python pandas seaborn


    【解决方案1】:

    groupbysizeunstackcrosstab 一起使用以进行整形。

    如需更改天数,需按列ordered Categoricalreindex

    cats = ['Monday','Tuesday','Wednesday','Thursday','Friday']
    
    df['Weekday'] = pd.Categorical(df['Weekday'], categories=cats, ordered=True)
    
    df = df.groupby(['Time', 'Weekday']).size().unstack(fill_value=0)
    

    df = df.groupby(['Time', 'Weekday']).size().unstack(fill_value=0).reindex(columns=cats)
    

    替代方案:

    df = pd.crosstab(df['Time'], pd.Categorical(df['Weekday'], categories=cats, ordered=True))
    
    df = pd.crosstab(df['Time'], df['Weekday']).reindex(columns=cats)
    

    print (df)
    
    col_0     Monday  Tuesday  Wednesday  Thursday  Friday
    Time                                                  
    21:10:00       0        1          0         0       0
    21:15:00       0        1          0         0       0
    21:20:00       0        2          0         0       0
    21:25:00       0        0          2         0       0
    21:30:00       0        0          0         0       1
    21:35:00       0        0          1         1       0
    21:40:00       1        0          2         0       0
    

    最后使用seaborn.heatmap

    import seaborn as sns
    
    sns.heatmap(df, annot=True, fmt="g", cmap='viridis')
    

    【讨论】:

    • 以上,谢谢。我想要底部的时间,所以我使用了 sns.heatmap(df.T, ...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    相关资源
    最近更新 更多