【问题标题】:How to compute counts on a pandas DataFrame column in Python, given an input list of values?给定输入值列表,如何计算 Python 中 pandas DataFrame 列的计数?
【发布时间】:2021-04-16 20:59:40
【问题描述】:

我有一个指定日期范围的列表(通过pandas.date_range() 获得),假设:

dates = ["2016-1-1", "2016-1-2", "2016-1-3", "2016-1-4", "2016-1-5", "2016-1-6"]

和一个在一列中有开始日期的pandas DataFrame,即:

df = {"start_date": ["2016-1-3", "2016-1-2", "2016-1-6", "2016-1-6", "2016-1-1"],
      "event": ["task1", "task43", "task2", "task9", "task6"]}

因此,我想知道dates 列表中的每个元素在DataFrame 的start_date 列中出现的频率。

根据这个例子,我想要的输出是:

[1, 1, 1, 0, 0, 2]

我必须计算一些关于输出的统计数据,所以一个简单的计数列表就足够了。通常我可以在 DataFrame 列上运行一个计数器,但由于我还希望 DataFrame 列中没有出现的日期计数为零,因此据我所知这是不可能的。

解决这个问题的最有效方法是什么?我必须在其上运行它的实际 DataFrame 非常庞大,因此如果可能有多种解决方案,我正在寻找最耗时的一种。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    将值转换为 DataFrame:

    df = pd.DataFrame(df)
    

    使用Series.value_counts 和Series.reindex 将 - 列和 lsit 都转换为日期时间的第一个想法:

    dates = ["2016-1-1", "2016-1-2", "2016-1-3", "2016-1-4", "2016-1-5", "2016-1-6"]
    
    df['start_date'] = pd.to_datetime(df['start_date'])
    dates = pd.to_datetime(dates)
    
    L = df['start_date'].value_counts().reindex(dates, fill_value=0).tolist()
    print (L)
    [1, 1, 1, 0, 0, 2]
    

    或不转换为日期时间的解决方案:

    dates = ["2016-1-1", "2016-1-2", "2016-1-3", "2016-1-4", "2016-1-5", "2016-1-6"]
    
    L = df['start_date'].value_counts().reindex(dates, fill_value=0).tolist()
    

    【讨论】:

    • 感谢您的解决方案,但是当我执行第二个选项时,我得到: AttributeError: 'list' object has no attribute 'value_counts'
    • @Peter - 也许缺少df = pd.DataFrame(df)?
    猜你喜欢
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 2017-03-01
    相关资源
    最近更新 更多