【问题标题】:Zero occurrences/frequency using value_counts() in PANDAS使用 PANDAS 中的 value_counts() 零出现/频率
【发布时间】:2018-07-25 13:30:44
【问题描述】:

我有一个表格,其中包含日期和每个日期销售的各种汽车,格式如下(这些只是许多列中的 2 个):

DATE       CAR
2012/01/01 BMW
2012/01/01 Mercedes Benz
2012/01/01 BMW
2012/01/02 Volvo
2012/01/02 BMW
2012/01/03 Mercedes Benz
...
2012/09/01 BMW
2012/09/02 Volvo

我执行以下操作来查找每天销售的宝马汽车的数量

df[df.CAR=='BMW']['DATE'].value_counts()

结果是这样的:

2012/07/04 15
2012/07/08 8
...
2012/01/02 1

但是有些日子没有宝马汽车售出。结果,与上述一起,我想要宝马零出现的日子。因此,期望的结果是:

2012/07/04 15
2012/07/08 8
...
2012/01/02 1
2012/01/09 0
2012/08/11 0

我该怎么做才能达到这样的结果?

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    您可以在value_counts 之后重新索引结果,并用 0 填充缺失的值。

    df.loc[df.CAR == 'BMW', 'DATE'].value_counts().reindex(
        df.DATE.unique(), fill_value=0)
    

    输出:

    2012/01/01    2
    2012/01/02    1
    2012/01/03    0
    2012/09/01    1
    2012/09/02    0
    Name: DATE, dtype: int64
    

    除了value_counts,您还可以考虑检查按日期分组的相等和求和,这将包括所有这些。

    df['CAR'].eq('BMW').astype(int).groupby(df['DATE']).sum()
    

    输出:

    DATE
    2012/01/01    2
    2012/01/02    1
    2012/01/03    0
    2012/09/01    1
    2012/09/02    0
    Name: CAR, dtype: int32
    

    【讨论】:

    • 类似情况。使用 .reindex(range(10), fill_value=0) 强制为 10 行。在需要的地方填零。
    【解决方案2】:

    category 类型的默认行为正是您想要的。不存在的类别将显示为零值。你只需要这样做:

    df.astype({'CAR': 'category'})[df.CAR=='BMW']['DATE'].value_counts()
    

    或者更好的是,让它明确地成为您数据框中的一个类别:

    df.CAR = df.CAR.astype('category')
    df[df.CAR=='BMW'].DATE.value_counts()
    

    类别类型可以更好地表示您的数据并且更节省空间。

    【讨论】:

    猜你喜欢
    • 2016-08-14
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 2018-03-24
    • 2022-12-02
    • 1970-01-01
    相关资源
    最近更新 更多