Python 使用复杂条件求和逻辑在数据帧中创建新字段

Python 使用复杂条件求和逻辑在数据帧中创建新字段,python,if-statement,sum,conditional-statements,pandas-groupby,Python,If Statement,Sum,Conditional Statements,Pandas Groupby,下面是我的表(Python数据框架)。我正在尝试用紫色文本创建最后一列 下面是我想要实现的逻辑: 对于每个唯一的“cbsa”值,如果关联的“zip”字段值都相同,则将“age_HC01_EST_VC31_2”字段设置为“age_HC01_EST_VC31”字段(请参见以黄色突出显示的行) 对于每个唯一的“cbsa”值,如果关联的“zip”字段值不同,则将“age_HC01_EST_VC31_2”字段设置为等于“age_HC01_EST_VC31”字段值之和(请参见以橙色突出显示的行) 对于每个

下面是我的表(Python数据框架)。我正在尝试用紫色文本创建最后一列

下面是我想要实现的逻辑:

  • 对于每个唯一的“cbsa”值,如果关联的“zip”字段值都相同,则将“age_HC01_EST_VC31_2”字段设置为“age_HC01_EST_VC31”字段(请参见以黄色突出显示的行)

  • 对于每个唯一的“cbsa”值,如果关联的“zip”字段值不同,则将“age_HC01_EST_VC31_2”字段设置为等于“age_HC01_EST_VC31”字段值之和(请参见以橙色突出显示的行)

  • 对于每个唯一的“cbsa”值,如果关联的“zip”字段值有些相同,有些不同,则将“age_HC01_EST_VC31_2”字段设置为唯一的“age_HC01_EST_VC31”字段值之和(请参见以蓝色突出显示的行)


  • 我尝试使用groupby,然后在“cbsa”字段上求和。。。但是对于我试图实现的特定的、多层次的逻辑,它不起作用

    如果我没有弄错的话,您的逻辑可以总结如下:对于每个唯一的“cbsa”值,将“age_HC01_EST_VC31_2”字段设置为唯一的“age_HC01_EST_VC31”字段值之和

    如果这是正确的,这里有一种方法:第一组由
    cbsa
    ,找到唯一的
    age\u HC01\u EST\u VC31
    值并将这些值相加

    import pandas as pd
    dic = {'zip': [57401, 57401, 57401, 57401, 98520, 98550, 79604, 79602, 79602, 79601],
           'age_HC01_EST_VC31': [15.5, 15.5, 15.5, 15.5, 13.5, 17.3, 14.9, 18, 18, 11],
           'cbsa': [10100, 10100, 10100, 10100, 10140, 10140, 10180, 10180, 10180, 10180]}
    df = pd.DataFrame(dic)
    df.join(df.groupby('cbsa').age_HC01_EST_VC31.unique().apply(sum), on='cbsa', rsuffix='_2')
    
    #    age_HC01_EST_VC31   cbsa    zip  age_HC01_EST_VC31_2
    # 0               15.5  10100  57401                 15.5
    # 1               15.5  10100  57401                 15.5
    # 2               15.5  10100  57401                 15.5
    # 3               15.5  10100  57401                 15.5
    # 4               13.5  10140  98520                 30.8
    # 5               17.3  10140  98550                 30.8
    # 6               14.9  10180  79604                 43.9
    # 7               18.0  10180  79602                 43.9
    # 8               18.0  10180  79602                 43.9
    # 9               11.0  10180  79601                 43.9
    

    这是一段很长的路,但是完成了工作(您需要重命名年龄列-我刚刚称之为age1)


    也许还有其他简单的方法。但这也行得通
    df['new_column']="" #Initialise and empty column
    
    #iterate through all unique values
    for item in df['cbsa'].unique():
        if len(df['zip'].loc[df['cbsa']==item].unique())==1:
            df['new_column'].loc[df['cbsa']==item] = df['age_HC01_EST_VC31'].loc[df['cbsa']==item]
        else:
            df['new_column'].loc[df['cbsa']==item] = sum(df['age_HC01_EST_VC31'].loc[df['cbsa']==item].unique())
    
    grouped = df.groupby(['cbsa','zip'])[['age1']].mean().reset_index()
    summed = grouped.groupby(['cbsa'])[['age1']].sum().reset_index()
    df = pd.merge(df, summed, how='left', on='cbsa')