Python - 基于列条件求和值

马蒂法帕

首先很抱歉,如果标题不是很清楚,但我不太知道如何放置(或搜索它)。

我有一个类似于以下内容的 DataFrame (df):

    Num Let
0     1   a
1     2   b
2     3   c
3     4   d
4     1   a
5     2   b
6     1   a

我的目的是创建一个新的 df (df_new),其中一列仅包含 df['Let'] 列的一个实例,另一列包含它们在 df['Num'] 中的值的总和。

我所做的一切都很好,但我认为它可以以更pythonic的方式完成。此外,我需要多次将此代码应用于大型数据集。结果 (df_new) 应该是:

       Let  Count  Sum
0       a      3    3
1       b      2    4
2       d      1    4
3       c      1    3

我的代码:

# Create df_new
df_new = df['Let'].value_counts().rename_axis('Letters').reset_index(name='Count')

# Find indexes of each instance in df['Let']
def find_indexes(entry):
    x = df.index[df['Let'] == entry].tolist()
    return x

indexes = [find_indexes(x) for x in a]

# Transform into dictionary
pairs = list(zip(a, indexes))
my_dict = dict(pairs)

def find_sum(entry):
    index_list = my_dict[entry] # Get the proper index list
    nums = []
    for i in index_list: 
        x = df['Nums'][i]
        nums.append(x)
    return sum(nums)            

df_new['Sum'] = [find_sum(x) for x in df_new['Letters']]

提前致谢!

亚历山大 B.

您可以尝试groupby使用agg以下方法进行聚合

df.groupby("Let").agg(["count", "sum"])

输出

#     count sum
# Let
# a       3   3
# b       2   4
# c       1   3
# d       1   4

要重置"Let"索引,请使用reset_index

df.groupby("Let")["Num"].agg(["count", "sum"]).reset_index()
#   Let  count  sum
# 0   a      3    3
# 1   b      2    4
# 2   c      1    3
# 3   d      1    4

注意:这里,我["Num"]在 之后指定groupby删除多级列。

另一种写法是:

df.groupby("Let").agg(count=("Num": lambda x: x.count()),
                      sum=("Num": lambda x: x.sum())) \
                 .reset_index()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章