Python 如何在DataFrame中增加groupby中的行数
我需要计算数据框中每个产品的活动月数。以下是我目前的数据和代码:Python 如何在DataFrame中增加groupby中的行数,python,pandas,Python,Pandas,我需要计算数据框中每个产品的活动月数。以下是我目前的数据和代码: from pandas import DataFrame from datetime import datetime data = [ ('product_a','08/31/2013') ,('product_b','08/31/2013') ,('product_c','08/31/2013') ,('product_a','09/30/2013') ,('product_b','09/30/2013') ,('product
from pandas import DataFrame
from datetime import datetime
data = [
('product_a','08/31/2013')
,('product_b','08/31/2013')
,('product_c','08/31/2013')
,('product_a','09/30/2013')
,('product_b','09/30/2013')
,('product_c','09/30/2013')
,('product_a','10/31/2013')
,('product_b','10/31/2013')
,('product_c','10/31/2013')
]
product_df = DataFrame( data, columns=['prod_desc','activity_month'])
for index, row in product_df.iterrows():
row['activity_month']= datetime.strptime(row['activity_month'],'%m/%d/%Y')
product_df.loc[index, 'activity_month'] = datetime.strftime(row['activity_month'],'%Y-%m-%d')
product_df = product_df.sort(['prod_desc','activity_month'])
product_df['month_num'] = product_df.groupby(['prod_desc']).size()
但是,这将返回第个月的NaN
以下是我想要得到的:
prod_desc activity_month month_num
product_a 2014-08-31 1
product_a 2014-09-30 2
product_a 2014-10-31 3
product_b 2014-08-31 1
product_b 2014-09-30 2
product_b 2014-10-31 3
product_c 2014-08-31 1
product_c 2014-09-30 2
product_c 2014-10-31 3
groupby是正确的想法,但正确的方法是
cumcount
:
>>> product_df['month_num'] = product_df.groupby('product_desc').cumcount()
>>> product_df
product_desc activity_month prod_count pct_ch month_num
0 product_a 2014-01-01 53 NaN 0
3 product_a 2014-02-01 52 -0.018868 1
6 product_a 2014-03-01 50 -0.038462 2
1 product_b 2014-01-01 44 NaN 0
4 product_b 2014-02-01 43 -0.022727 1
7 product_b 2014-03-01 41 -0.046512 2
2 product_c 2014-01-01 36 NaN 0
5 product_c 2014-02-01 35 -0.027778 1
8 product_c 2014-03-01 34 -0.028571 2
如果您真的希望它从1开始,那么只需执行以下操作:
>>> product_df['month_num'] = product_df.groupby('product_desc').cumcount() + 1
product_desc activity_month prod_count pct_ch month_num
0 product_a 2014-01-01 53 NaN 1
3 product_a 2014-02-01 52 -0.018868 2
6 product_a 2014-03-01 50 -0.038462 3
1 product_b 2014-01-01 44 NaN 1
4 product_b 2014-02-01 43 -0.022727 2
7 product_b 2014-03-01 41 -0.046512 3
2 product_c 2014-01-01 36 NaN 1
5 product_c 2014-02-01 35 -0.027778 2
8 product_c 2014-03-01 34 -0.028571 3
在迭代时修改值,这在python中是不允许的(它可以像iter行在单个dtype情况下返回视图一样工作),但通常是一个坏主意);始终返回一个新帧(或复制并修改副本)使用pd.to_datetime()在一张快照中转换所有日期我还不清楚您想要实现什么:是否应将
month_num
简单地等于activity_month
中的月份?你的最终目标是什么?@ojdo good point。我将对示例进行编辑,使其更加清晰。我对数月的活动感兴趣。这与现在是哪个月无关。如果一个产品有5个活动月,我需要该组中的行数从1变为5。我将为第一个月、第二个月等的单独计算添加逻辑。。。