使用复杂的条件求和逻辑在Dataframe中创建新字段

时间:2017-06-28 19:47:28

标签: python if-statement sum conditional-statements pandas-groupby

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

enter image description here

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

  1. 对于每个唯一的'cbsa'值,如果关联的'zip'字段值都相同,则将'age_HC01_EST_VC31_2'字段设置为等于'age_HC01_EST_VC31'字段(请参阅以黄色突出显示的行)。

  2. 对于每个唯一的'cbsa'值,如果关联的'zip'字段值不同,则将'age_HC01_EST_VC31_2'字段设置为等于'age_HC01_EST_VC31'字段值的总和(请参阅以橙色突出显示的行)。

  3. 对于每个唯一的'cbsa'值,如果关联的'zip'字段值有些相同且有些不同,则将'age_HC01_EST_VC31_2'字段设置为等于UNIQUE'age_HC01_EST_VC31'字段值的总和(请参阅行以蓝色突出显示。

  4. 我尝试过使用groupby然后总结'cbsa'字段...但它不适用于我正在尝试实现的特定的多层逻辑。

3 个答案:

答案 0 :(得分:1)

"_links": {
    "user": {
        "href": "http://localhost:8080/api/users/1",
        "title": "Utente"
    }
}

"users": {
    "href": "http://localhost:8080/api/users{?page,size,sort}",
    "templated": true,
    "title": "Lista utenti"
}

答案 1 :(得分:0)

如果我没有弄错的话,你的逻辑可归纳如下:对于每个独特的“cbsa”'值,设置' age_HC01_EST_VC31_2'字段等于UNIQUE' age_HC01_EST_VC31'的总和字段值。

如果这是正确的,可以采用以下方法:首先按cbsa分组,找到唯一的age_HC01_EST_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

答案 2 :(得分:0)

这是一个漫长的过程,但完成了工作(你需要重命名年龄列 - 我只称它为age1)。

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')