用字符串检查一列并从第二列获取值的总和(pythonic 方式)

Check one column with strings and get sum of values from second column (pythonic way)

给定这个数据框:

d = {'SITE':['AB', 'ON', 'YO', 'YO', 'AB'],
 'MARK':['ss', 'ss', 'tt', 'ss', 'tt'], 
 'SIZE': [4, 5, 2, 3, 4]} 

ex_df = pd.DataFrame(data=d) 

只得到 column['SIZE'] 个 can slice 的总和 AB 仅包含 df 使用 AB_df = ex_df[ex_df.SITE == 'AB'] 然后 AB_df.SIZE.sum(),即 8.

但是,给定一个包含 10,000 多行和 12 列以及 40 多个唯一 column['SITE'] 字符串的类似数据框。

Q1:如何才能得到每个 SITESIZE 总和,而不必编写 40 行与上面相同的代码(更改 SITE 名称)。

Q2:如何添加更多的条件,比如检查一个条件是否匹配两列SITE & MARK,然后得到SIZE和,而不用再写40行重复代码。

我想将结果保存在包含总和的列表或包含站点和总和的字典中 {AB:8, ON:5, ...},甚至是包含该信息的新数据框。

我尝试使用 40 unique siteslist 来遍历数据框列,但由于长度差异等原因没有成功

我正在寻找理想的 pythonic。谢谢!

Q1 可以用 Pandas 中的 groupby 完成:

grouped_df = ex_df.groupby('SITE').agg({'SIZE': 'sum'}

要完成第二季度,您可能需要实现自定义函数以传递给 .agg 调用,例如:

def my_filter(df: pd.Dataframe):
    # Filters can be modified as needed
    return df[df['SITE'].startswith('A') & df['MARK'] == 'tt']['SIZE'].sum()

grouped_df = ex_df.groupby('SITE').agg(my_filter)

但是,如果您的第二季度目标只是按 SITE AND MARK 对行进行分组,您可以:

grouped_df = ex_df.groupby(['SITE', 'MARK']).agg({'SIZE': 'sum'})

那你就不用担心写自定义过滤函数了

IIUC 这应该为您提供每一行的每个站点的总和:

ex_df['Max'] = ex_df.groupby(['SITE'])['SIZE'].transform(sum)

如果不是,请进一步说明以获得进一步的帮助。