我通常使用value_counts()
来获取值的出现次数。但是,我现在处理大型数据库表(无法将其完全加载到RAM中)并在1个月的时间内查询数据。
有没有办法存储value_counts()
的结果并将其合并/将其添加到下一个结果中?
我想计算用户操作的数量。假设以下结构 用户活动日志:
# month 1
id userId actionType
1 1 a
2 1 c
3 2 a
4 3 a
5 3 b
# month 2
id userId actionType
6 1 b
7 1 b
8 2 a
9 3 c
在这些产品上使用value_counts()
:
# month 1
userId
1 2
2 1
3 2
# month 2
userId
1 2
2 1
3 1
预期产出:
# month 1+2
userId
1 4
2 2
3 3
到目前为止,我刚刚找到了一个使用groupby和sum的方法:
# count users actions and remember them in new column
df1['count'] = df1.groupby(['userId'], sort=False)['id'].transform('count')
# delete not necessary columns
df1 = df1[['userId', 'count']]
# delete not necessary rows
df1 = df1.drop_duplicates(subset=['userId'])
# repeat
df2['count'] = df2.groupby(['userId'], sort=False)['id'].transform('count')
df2 = df2[['userId', 'count']]
df2 = df2.drop_duplicates(subset=['userId'])
# merge and sum up
print pd.concat([df1,df2]).groupby(['userId'], sort=False).sum()
什么是pythonic / pandas'合并几个系列的信息的方式' (和数据帧)有效吗?
答案 0 :(得分:3)
让我建议"添加"并且指定填充值为0.这比之前建议的答案有一个优势,即当两个Dataframe具有不同的唯一键集时,它将起作用。
# Create frames
df1= pd.DataFrame({'User_id': ['a','a','b','c','c','d'],'a':[1,1,2,3,3,5]})
df2= pd.DataFrame({'User_id': ['a','a','b','b','c','c','c'],'a' [1,1,2,2,3,3,4]})
现在添加两组values_counts()。 fill_value参数将处理将出现的任何NaN值,在本例中为' d'出现在df1中,但不是df2。
a = df1.User_id.value_counts()
b = df2.User_id.value_counts()
a.add(b,fill_value=0)
答案 1 :(得分:2)
您可以直接对series
方法生成的value_counts
求和:
#create frames
df= pd.DataFrame({'User_id': ['a','a','b','c','c'],'a':[1,1,2,3,3]})
df1= pd.DataFrame({'User_id': ['a','a','b','b','c','c','c'],'a':[1,1,2,2,3,3,4]})
总结系列:
df.User_id.value_counts() + df1.User_id.value_counts()
输出:
a 4
b 3
c 5
dtype: int64
答案 2 :(得分:0)
这被称为" Split-Apply-Combine"。使用如下的lambda函数以1行和3-4次点击完成。
1️⃣将其粘贴到您的代码中:
df['total_for_this_label'] = df.groupby('label', as_index=False)['label'].transform(lambda x: x.count())
2️⃣将3x label
替换为您正在计算其值的列的名称(区分大小写)
3️打印df.head()以检查它是否正常工作