如何获得Pandas中多个日期的数据聚合?

2024-06-10 01:27:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据

import pandas as pd
import numpy as np

df = pd.DataFrame(data={'name':['a', 'b', 'c', 'd', 'e', 'f'],
                        'vaccine_1':['2021-01-20', '2021-01-20', '2021-02-20', np.nan, '2021-02-22', '2021-02-23'],
                        'vaccine_2':['2021-02-22', '2021-02-22', '2021-02-25', np.nan, '2021-03-22', np.nan]})

df['vaccine_1'] = pd.to_datetime(df['vaccine_1']).dt.date
df['vaccine_2'] = pd.to_datetime(df['vaccine_2']).dt.date
df

我想把这个表转换成这样的东西

^{tb1}$

基本上,我想得到每个日期的总和,以得到在特定日期有多少人接种了疫苗,但由于有两个日期,我迷路了

一个简单的groupby不会给我结果

df.groupby(['vaccine_1'])['name'].count()

代码只告诉我第一次接种疫苗的人数,我无法获得第二次。我如何解决这个问题?谢谢


Tags: to数据nameimportdfdatetimedateas
3条回答

您可以进行熔化,获取值计数,然后取消堆叠以将疫苗作为标题:

 (df.melt('name', value_name = 'Date')
    .drop(columns='name')
    .value_counts()
    .unstack('variable', fill_value=0)
    .add_suffix('_total')
     # last two not necessary
     # indexes are a good thing
    .rename_axis(columns=None)
    .reset_index()
  )

              vaccine_1_total  vaccine_2_total
Date
2021-01-20                2                0
2021-02-20                1                0
2021-02-22                1                2
2021-02-23                1                0
2021-02-25                0                1
2021-03-22                0                1

分别计算每个vaccine列:

(df.filter(like='vaccine')
   .apply(pd.Series.value_counts)
   .fillna(0)
   .add_suffix('_total')
   .rename_axis('date')
   .reset_index())

         date  vaccine_1_total  vaccine_2_total
0  2021-01-20              2.0              0.0
1  2021-02-20              1.0              0.0
2  2021-02-22              1.0              2.0
3  2021-02-23              1.0              0.0
4  2021-02-25              0.0              1.0
5  2021-03-22              0.0              1.0

我们可以首先使用^{}融化数据帧,然后使用^{}

out = df.filter(like='vaccine').melt(var_name='vaccine', value_name='date')
print(pd.crosstab(out['date'], out['vaccine']))

vaccine     vaccine_1  vaccine_2
date                            
2021-01-20          2          0
2021-02-20          1          0
2021-02-22          1          2
2021-02-23          1          0
2021-02-25          0          1
2021-03-22          0          1

相关问题 更多 >