合并并总结了Pandas中的几个价值计数系列

时间:2015-02-05 20:39:36

标签: python pandas count

我通常使用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'合并几个系列的信息的方式' (和数据帧)有效吗?

3 个答案:

答案 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()以检查它是否正常工作