如何使用Pandas的DataFrame统计一个月内的每日病例数?

pprl5pva  于 2022-12-09  发布在  其他
关注(0)|答案(2)|浏览(112)

我现将某个月内每日的个案数目统计如下:

import pandas as pd

d1 = pd.DataFrame({'ID': ["A", "A", "A", "B", "B", "C", "C", "C", "C", "D", "D", "D"],
                   "date": ["2010-12-30", "2010-02-27", "2010-02-26", "2012-01-01", "2012-01-03",
                            "2011-01-01", "2011-01-02", "2011-01-08", "2014-02-21", "2010-08-31", "2010-08-30", "2010-09-01"]})

最后的结果是这样的:

ID year_month  count
0  A    2010-02      2
1  A    2010-12      1
2  B    2012-01      2
3  C    2011-01      3
4  C    2014-02      1
5  D    2010-08      2
6  D    2010-09      1

你有什么想法如何产生像上面这样的DataFrame吗?我使用了groupbyapply函数,但不能产生这样的。提前感谢!

nzkunb0c

nzkunb0c1#

Series.dt.to_period用于月份期间,并按GroupBy.size计数:

#convert to datetimes if necessary
#d1['date'] = pd.to_datetime(d1['date'])

df = (d1.groupby(['ID', d1['date'].dt.to_period('m').rename('year_month')])
        .size()
        .reset_index(name='count'))
print (df)
  ID year_month  count
0  A    2010-02      2
1  A    2010-12      1
2  B    2012-01      2
3  C    2011-01      3
4  C    2014-02      1
5  D    2010-08      2
6  D    2010-09      1

Series.dt.strftime的另一个想法是:

#convert to datetimes if necessary
#d1['date'] = pd.to_datetime(d1['date'])

df = (d1.groupby(['ID', d1['date'].dt.strftime('%Y-%m').rename('year_month')])
        .size()
        .reset_index(name='count'))
print (df)
  ID year_month  count
0  A    2010-02      2
1  A    2010-12      1
2  B    2012-01      2
3  C    2011-01      3
4  C    2014-02      1
5  D    2010-08      2
6  D    2010-09      1

如果没有日期时间,而是字符串:

df = (d1.groupby(['ID', d1['date'].str[:7].rename('year_month')])
        .size()
        .reset_index(name='count'))
print (df)
  ID year_month  count
0  A    2010-02      2
1  A    2010-12      1
2  B    2012-01      2
3  C    2011-01      3
4  C    2014-02      1
5  D    2010-08      2
6  D    2010-09      1
63lcw9qa

63lcw9qa2#

使用applygroupby应该可以:

import pandas as pd

d1 = pd.DataFrame({'ID': ["A", "A", "A", "B", "B", "C", "C", "C", "C", "D", "D", "D"],
                   "date": ["2010-12-30", "2010-02-27", "2010-02-26", "2012-01-01", "2012-01-03",
                            "2011-01-01", "2011-01-02", "2011-01-08", "2014-02-21", "2010-08-31", "2010-08-30", "2010-09-01"]})

d1["month_year"] = d1.apply(lambda row: row["date"][:7])
month_year = d1.groupby("month_year").size().reset_index(name="count")

print(month_year)

这将导致:

month_year  count
0    2010-02      2
1    2010-08      2
2    2010-09      1
3    2010-12      1
4    2011-01      3
5    2012-01      2
6    2014-02      1

您可能需要更改apply lambda以更仔细地处理日期。

相关问题