首页 > 解决方案 > Pandas groupby 根据条件创建新列

问题描述

在下表中,我想为由地址相关字段 X、Y、Z(Groupby XYZ)创建的组生成列新区域。如果在代码列中,如果值为A,则只计算该区域一次,并将剩余区域添加到其他代码中。

所以对于这个组,新的面积应该是100(A)+200(B)+300(C)= 600。注意不能取和,因为A重复了两次。只想将值 A 的一个区域计入总和,而不是全部

在此处输入图像描述

获取上表:

df['X'] = ['222 North St','222 North St','222 North St','222 North St','115 John St','115 John St','115 John St']
df['Y'] = ['Seattle','Seattle','Seattle','Seattle','Chicago','Chicago','Chicago']
df['Z'] = ['WA','WA','WA','WA','IL','IL','IL']
df['code'] = ['A','B','A','C','A','A','B']
df['area'] = [100,200,100,300,200,200,50]```

标签: pythonpandasgroup-by

解决方案


所以这行得通,但不确定它是否是最有效的方法。由于您没有指定在有多个代码时要采用哪个area代码,因此我假设它们将保留相同的值,因此删除了重复项。

import pandas as pd 

df = pd.DataFrame()
df['X'] = ['222 North St','222 North St','222 North St','222 North St','115 John St','115 John St','115 John St']
df['Y'] = ['Seattle','Seattle','Seattle','Seattle','Chicago','Chicago','Chicago']
df['Z'] = ['WA','WA','WA','WA','IL','IL','IL']
df['code'] = ['A','B','A','C','A','A','B']
df['area'] = [100,200,100,300,200,200,50]

df2 = df.drop_duplicates(subset=['X','Y','Z','code']).groupby(['X','Y','Z']).agg({'area':'sum'}).reset_index()
df = pd.merge(df,df2,how='left',on=['X','Y','Z']).rename(columns={'area_x':'area','area_y':'area sum'})

此外,如果您能够自己提供上述代码的第一部分,您将吸引更多人尝试回答您的问题。

编辑:

# drop duplicates but only for code = A
df_A = df[df['code']=='A'].drop_duplicates(subset=['X','Y','Z','code'])

# groupby and sum now that A only appears once - this creates the 'area sum'
df2 = pd.concat([df[df['code']!='A'],df_A]).groupby(['X','Y','Z']).agg({'area':'sum'}).reset_index()

# merge onto original dataframe
df = pd.merge(df,df2,how='left',on=['X','Y','Z']).rename(columns={'area_x':'area','area_y':'area sum'})

推荐阅读