【发布时间】:2014-07-10 14:49:36
【问题描述】:
我需要计算 pandas DataFrame 中每个产品的活动月数。到目前为止,这是我的数据和代码:
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()
但是,这会返回 month_num 的 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
【问题讨论】:
-
您在迭代时修改值,这在 python 中是不允许的(它可以作为迭代行将在单个 dtype 情况下返回视图),但通常是个坏主意);总是返回一个新框架(或复制并修改副本)
-
使用 pd.to_datetime() 一次性转换您的日期
-
我还不清楚你想要实现什么:
month_num是否应该等于activity_month中的月份?你的最终目标是什么? -
@ojdo 好点。我将编辑该示例以使其更加清晰。我有兴趣计算activity_months。这与现在是几月无关。如果一个产品有 5 个 activity_months,我需要该组中的行数从 1 变为 5。我将为第一个月、第二个月等的单独计算添加逻辑......