【发布时间】:2021-03-22 01:35:23
【问题描述】:
问题
我有一个数据框 df 包含这样的产品:
ID DATE TYPE Client_ID
1 2015-01-15 A johndoe
2 2009-01-15 C johndoe
3 2015-03-12 C johndoe
4 2010-01-01 B johndoe
5 2017-01-01 B johndoe
6 2018-01-01 A markdoe
7 2019-01-01 C johndoe
8 2012-01-01 C markdoe
从这个我创建了一个只有 A 类产品的数据框,df-A:
ID DATE TYPE Client_ID
1 2015-01-15 A johndoe
6 2018-01-01 A markdoe
我想要创建df-A 2 个变量,这些变量计算客户拥有的 B 型和 C 型产品的数量,其日期低于或等于分析的 A 产品。
我想要的结果:
ID DATE TYPE Client_ID NB-B NB-C
1 2015-01-15 A johndoe 1 1
6 2018-01-01 A markdoe 0 1
第一行的NB-B 是1,因为johndoe 有2 个B 产品,但只有一个有Date <= 2015-01-15(这个产品是ID=4,日期为2010-01-01)
我尝试了什么:
我是使用 iterrows 或 apply 完成的。这可能行得通,但需要很长时间,我真的需要通过一些 groupby 和聚合使其更快。
for index, row in df-A.iterrows():
row['NB-B'] = df[(df['ID'] == row['ID']) & (df['DATE'] <= row['DATE'])].groupby('TYPE').count()['ID'].loc['B']
apply也一样
def B(x):
return(row['NB-B'] = df[(df['ID'] == x['ID']) & (df['DATE'] <= x['DATE'])].groupby('TYPE').count()['ID'].loc['B'])
df-A.apply(lambda x: B(x), axis=1)
提前感谢您的帮助
编辑:@Quang Hoang 回答后的详细信息
一个客户可以在不同的日期拥有多个 A 类产品(我没有提到它是为了简化,因为问题已经很复杂,我没想到会做出很大的改变)。另外,我想像Bs和Cs一样统计客户购买新产品后拥有的A产品的数量。
例子:
ID DATE TYPE Client_ID
1 2015-01-15 A johndoe
2 2009-01-15 C johndoe
3 2015-03-12 C johndoe
4 2010-01-01 B johndoe
5 2017-01-01 B johndoe
6 2020-01-01 A johndoe
7 2019-01-01 C johndoe
预期结果:
ID DATE TYPE Client_ID NB-A NB-B NB-C
1 2015-01-15 A johndoe 1 1 1
6 2018-01-01 A johndoe 2 2 3
这个细节很重要,因为应用你的代码,我得到了以下错误:Reindexing only valid with uniquely valued Index objects 因为Client_ID,成为s 的新索引,不是唯一的。
我试图解决这个问题,但没有成功。
【问题讨论】:
标签: python python-3.x pandas dataframe group-by