我有一个包含两列的df:日期和产品,某些产品可能在某些月份可用,而在其他月份不可用,我需要获得每个产品的可用月数。
In [1]: data = {'Date': ['04-02-2022', '04-03-2022', '04-29-2022', '04-30-2022','05-02-2022','05-04-2022','05-20-2022','05-25-2022',
'05-30-2022','06-02-2022','06-05-2022','06-10-2022','06-12-2022','06-25-2022','06-30-2022','07-02-2022',
'07-02-2022','07-05-2022','07-08-2022','07-15-2022','08-02-2022','08-12-2022','08-15-2022'],
'Products': ['prod1', 'prod1', 'prod2', 'prod3','prod1','prod2','prod1','prod3','prod3','prod1','prod2','prod3','prod2',
'prod3','prod1','prod2','prod2','prod2','prod3','prod3','prod3','prod3','prod3']}
df = pd.DataFrame(data)
df['Date'] = df['Date'].astype('datetime64')
当我使用下面的print()
我得到每个产品的月数。
In [2]: for product in df['Products'].unique():
num_months = df.loc[df.Products==product].Date.dt.to_period('M')
num_months = num_months.unique()
num_months = num_months.size
print(num_months)
Out [3]: 3
4
5
Prod1在3个不同的月份可用,prod2在4个不同的月份可用,prod3在5个不同的月份可用。
但是,我尝试创建一个函数,我可以给予它一个参数,并返回每个产品的可用月数,该函数只返回prod3的最后一个数字计数。
In [4]: def months_count(product):
for product in df['Products'].unique():
num_of_months = df.loc[df.Products==product].Date.dt.to_period('M')
num_of_months = num_of_months.unique()
num_of_months = num_of_months.size
return num_of_months
In [5]: months_count('prod1')
Out[5]: 5
这里的out只是prod3的月份计数,我做错了什么?
2条答案
按热度按时间wf82jlnq1#
不需要函数,只需对句点使用
groupby.nunique
:输出:
3qpi33ja2#
您在所有产品上定义的
months_count
循环,它应该只使用传递的product
作为参数。下面是您需要的
months_count
函数的正确版本: