《Pandas》中几个价值计数序列的合并与归纳

gxwragnw  于 2023-02-11  发布在  其他
关注(0)|答案(3)|浏览(135)

我通常使用value_counts()来获取一个值出现的次数,但是,我现在要处理的是大型数据库表(无法将其完全加载到RAM中),并且要查询一个月内的数据。
是否有办法存储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/panda如何有效地合并多个序列(和 Dataframe )的信息?

ergxz8rk

ergxz8rk1#

我建议使用“add”并将填充值指定为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)
y4ekin9u

y4ekin9u2#

可以直接对value_counts方法生成的series求和:

#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
cs7cruho

cs7cruho3#

这就是所谓的“拆分-应用-合并”。它是在1行和3-4次点击中完成的,使用一个lambda函数如下。
1️将以下内容粘贴到代码中:

df['total_for_this_label'] = df.groupby('label', as_index=False)['label'].transform(lambda x: x.count())

2️将3x label替换为要计算其值的列的名称(区分大小写)
3️打印df.head()以检查它是否正确工作

相关问题