按组的每个出现值构建计数列

Posted

技术标签:

【中文标题】按组的每个出现值构建计数列【英文标题】:Build count columns by each occurring value of groups 【发布时间】:2020-03-28 17:04:58 【问题描述】:

我有一个熊猫 DataFrame,每天有多个条目,按日期时间索引。现在我想按天对所有行进行分组,并使用当天出现的每个值的计数创建新列。

看看这个例子:

                           value
startDate
2017-06-08 16:00:00+01:00  True
2017-06-08 17:00:00+01:00  True
2017-06-08 18:00:00+01:00  True
2017-06-08 19:00:00+01:00  True
2017-06-08 20:00:00+01:00  True
...                        ...
2019-12-02 19:00:00+01:00  True
2019-12-02 20:00:00+01:00  False
2019-12-02 21:00:00+01:00  True
2019-12-02 22:00:00+01:00  True

我想将数据转换成这个结果:

            True  False
date
2017-06-08  5     0
...         ...   ...
2019-12-02  3     1

我发现我可以像这样按天分组:

df = pd.read_csv('./data.csv', parse_dates=[0], index_col=[0])

by_day = df.groupby(df.index.date)

不幸的是,我不知道如何从这里开始创建“计数列”,我在网上找到的所有资源只计算了每个组中的所有元素。任何正确方向的提示都表示赞赏!

【问题讨论】:

【参考方案1】:
df  = pandas.DataFrame(
    'date': ['2019-01-01', '2019-01-01', '2019-01-01', '2019-01-02', '2019-01-02'],
    'value': [True, False, False, True, False]
)

可以使用SeriesGroupBy对象的value_counts()函数:

documentation of that particular function有点薄,不过可以参考pandas.Series.value_counts() documentation,里面有参数。

df.groupby('date')['value'].value_counts().unstack(level='value', fill_value=0)

# Result:
value       False  True 
date                    
2019-01-01      2      1
2019-01-02      1      1

【讨论】:

以上是关于按组的每个出现值构建计数列的主要内容,如果未能解决你的问题,请参考以下文章

熊猫中按组的唯一性索引

如何按组汇总数据,通过创建虚拟变量作为折叠方法

Pandas 按组的时间累积总和

按组查找最近的日期和输出值

按组将唯一/不同值的计数添加到原始数据

Laravel 8 GroupBy 仅向我返回每个组的第一条记录,但我需要按组中的所有记录