用字符串检查一列并从第二列获取值的总和(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:如何才能得到每个 SITE
的 SIZE
总和,而不必编写 40 行与上面相同的代码(更改 SITE
名称)。
Q2:如何添加更多的条件,比如检查一个条件是否匹配两列SITE & MARK
,然后得到SIZE
和,而不用再写40行重复代码。
我想将结果保存在包含总和的列表或包含站点和总和的字典中 {AB:8, ON:5, ...}
,甚至是包含该信息的新数据框。
我尝试使用 40 unique sites
的 list
来遍历数据框列,但由于长度差异等原因没有成功
我正在寻找理想的 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)
如果不是,请进一步说明以获得进一步的帮助。
给定这个数据框:
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:如何才能得到每个 SITE
的 SIZE
总和,而不必编写 40 行与上面相同的代码(更改 SITE
名称)。
Q2:如何添加更多的条件,比如检查一个条件是否匹配两列SITE & MARK
,然后得到SIZE
和,而不用再写40行重复代码。
我想将结果保存在包含总和的列表或包含站点和总和的字典中 {AB:8, ON:5, ...}
,甚至是包含该信息的新数据框。
我尝试使用 40 unique sites
的 list
来遍历数据框列,但由于长度差异等原因没有成功
我正在寻找理想的 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)
如果不是,请进一步说明以获得进一步的帮助。