每月、每年分组的值计数 - Pandas
Posted
技术标签:
【中文标题】每月、每年分组的值计数 - Pandas【英文标题】:Count of values grouped per month, year - Pandas 【发布时间】:2019-09-07 14:45:54 【问题描述】:我正在尝试 groupby
在特定输出中计算每月和每年的日期。我可以每天做,但每个月/年不能得到相同的输出。
d = (
'Date' : ['1/1/18','1/1/18','2/1/18','3/1/18','1/2/18','1/3/18','2/1/19','3/1/19'],
'Val' : ['A','B','C','D','A','B','C','D'],
)
df = pd.DataFrame(data = d)
df['Date'] = pd.to_datetime(df['Date'], format= '%d/%m/%y')
df['Count_d'] = df.Date.map(df.groupby('Date').size())
这是我想要的输出:
Date Val Count_d
0 2018-01-01 A 2
1 2018-01-01 B 2
2 2018-01-02 C 1
3 2018-01-03 D 1
4 2018-02-01 A 1
5 2018-03-01 B 1
6 2019-01-02 C 1
7 2019-01-03 D 1
当我尝试做类似但每月和每年的事情时,我会使用以下内容:
df1 = df.groupby([df['Date'].dt.year.rename('year'), df['Date'].dt.month.rename('month')]).agg('count')
print(df)
但是输出是:
Date Val
count count
year month
2018 1 4 4
2 1 1
3 1 1
2019 1 2 2
预期输出:
Date Val Count_d Count_m Count_y
0 2018-01-01 A 2 4 6
1 2018-01-01 B 2 4 6
2 2018-01-02 C 1 4 6
3 2018-01-03 D 1 4 6
4 2018-02-01 A 1 1 6
5 2018-03-01 B 1 1 6
6 2019-01-02 C 1 2 2
7 2019-01-03 D 1 2 2
【问题讨论】:
【参考方案1】:将GroupBy.transform
用于与原始DataFrame 大小相同的列:
df['Date'] = pd.to_datetime(df['Date'], format= '%d/%m/%y')
y = df['Date'].dt.year
m = df['Date'].dt.month
df['Count_d'] = df.groupby('Date')['Date'].transform('size')
df['Count_m'] = df.groupby([y, m])['Date'].transform('size')
df['Count_y'] = df.groupby(y)['Date'].transform('size')
print(df)
Date Val Count_d Count_m Count_y
0 2018-01-01 A 2 4 6
1 2018-01-01 B 2 4 6
2 2018-01-02 C 1 4 6
3 2018-01-03 D 1 4 6
4 2018-02-01 A 1 1 6
5 2018-03-01 B 1 1 6
6 2019-01-02 C 1 2 2
7 2019-01-03 D 1 2 2
【讨论】:
刚刚发现他们正在使用 dict 删除 agg。知道为什么吗? @anky_91 - 因为与原始 df 相同大小的列。 你在哪里看到@anky_91 @Erfan 收到了未来的警告。我猜我执行错了,jez 说得很清楚【参考方案2】:您可以通过pd.Grouper
做到这一点
df['Count_d'] = df.groupby([pd.Grouper(key='Date', freq='D')])['Date'].transform('size').astype(int)
df['Count_m'] = df.groupby([pd.Grouper(key='Date', freq='M')])['Date'].transform('size').astype(int)
df['Count_y'] = df.groupby([pd.Grouper(key='Date', freq='Y')])['Date'].transform('size').astype(int)
这会给
Date Val Count_d Count_m Count_y
0 2018-01-01 A 2 4 6
1 2018-01-01 B 2 4 6
2 2018-01-02 C 1 4 6
3 2018-01-03 D 1 4 6
4 2018-02-01 A 1 1 6
5 2018-03-01 B 1 1 6
6 2019-01-02 C 1 2 2
7 2019-01-03 D 1 2 2
您可以使用它对各种不同的频率进行分组,请参阅documentation on DateOffsets
【讨论】:
以上是关于每月、每年分组的值计数 - Pandas的主要内容,如果未能解决你的问题,请参考以下文章