【问题标题】:Creating new columns by adding groups of columns通过添加列组创建新列
【发布时间】:2021-05-05 00:00:14
【问题描述】:

我有一个数据框

df = pd.DataFrame({ 
    'BU': ['Total', 'Total', 'Total', 'CRS', 'CRS', 'CRS'], 
    'Line_Item': ['Revenues','EBT', 'Expenses', 'Revenues', 'EBT', 'Expenses'],
    'Small Business Loans < $100K 2020 ($000)': [100, 120, 0, 200, 190, 210],
    'Small Business Loans < $100K 2019 ($000)': [100, 0, 130, 200, 190, 210],
    'Small Business Loans < $100K 2018 ($000)': [200, 250, 0, 120, 0, 190],
    'Small Business Loans $100K-$250K 2020 ($000)': [100, 120, 0, 200, 190, 210],
    'Small Business Loans $100K-$250K 2019 ($000)': [100, 0, 130, 200, 190, 210],
    'Small Business Loans $100K-$250K 2018 ($000)': [200, 250, 0, 120, 0, 190]
    'Multi Family Loans 2020 ($000)': [100, 120, 0, 200, 190, 210],
    'Multi Family Loans 2019 ($000)': [100, 0, 130, 200, 190, 210],
    'Multi Family Loans 2018 ($000)': [200, 250, 0, 120, 0, 190]
})

我希望创建新列,将“Small Business Loans

基本上我想按年查看贷款总额

实际的数据集有很多行和其他类似的列集。

如果两个数据框中的列名称相同,我可以使用

df_add = df1.add(df2, fill_value=0)

【问题讨论】:

    标签: python pandas multiple-columns


    【解决方案1】:

    更新:对于小型企业贷款,请尝试使用regex 过滤器:

    s = '\$(000)'
    years = range(2018, 2021)
    
    df.assign(**{
        f'SBL {y} {s}': df.filter(regex=fr'Small Business Loans.*{y}.*{s}').sum(1)
        for y in years
    })
    

    要结合 MF 和 SBL,请将 Small Business Loans 更改为 (Multi Family|Small Business Loans)

    df.assign(**{
        f'Loans {y} {s}': df.filter(regex=fr'(Multi Family|Small Business Loans).*{y}.*{s}').sum(1)
        for y in years
    })
    

    您可以assign() 新列与理解:

    df = df.assign(**{
        f'{i}Q16': df[f'{i}Q16-1'] + df[f'{i}Q16-2'] for i in [1,2,3]
    })
    

    也可以使用like 过滤器进行求和:

    df = df.assign(**{
        f'{i}Q16': df.filter(like=f'{i}Q16').sum(1) for i in [1,2,3]
    })
    

    输出:

          BU Line_Item  1Q16-1  2Q16-1  3Q16-1  1Q16-2  2Q16-2  3Q16-2  1Q16  2Q16  3Q16
    0  Total  Revenues     100     100     200     100     100     200   200   200   400 
    1  Total       EBT     120       0     250     120       0     250   240     0   500 
    2  Total  Expenses       0     130       0       0     130       0     0   260     0 
    3    CRS  Revenues     200     200     120     200     200     120   400   400   240 
    4    CRS       EBT     190     190       0     190     190       0   380   380     0 
    5    CRS  Expenses     210     210     190     210     210     190   420   420   380 
    

    【讨论】:

    • 我有同样的想法。 +1 过滤器。
    • @postcolonialist 所以你想要一列用于SBL_Under100K_2020 + SBL_100K_2020 + SBL_250K_2020,另一列用于SBL_Under100K_2021 + SBL_100K_2021 + SBL_250K_2021,等等?
    • @postcolonialist 请使用更复​​杂的表格更新您的问题
    • 正则表达式可能会提取尾随字符 2020 ($000) 等?
    • @postcolonialist 已修复(我认为)
    【解决方案2】:

    所以你需要这样做

    df['1Q16-sum'] = df['1Q16-1'] + df['1Q16-2']
    df['2Q16-sum'] = df['2Q16-1'] + df['2Q16-2']
    df['3Q16-sum'] = df['3Q16-1'] + df['3Q16-2']
    

    或循环

    # python 3.6+
    for i in range(1,4):
        df[f'{i}Q16-sum'] = df[f'{i}Q16-1'] + df[f'{i}Q16-2']
    
    # or other python versions
    for i in range(1,4):
        id = str(i) + "Q16"
        df[id+'-sum'] = df[id+'-1'] + df[id+'-2']
    

    给你

          BU Line_Item  1Q16-1  2Q16-1  3Q16-1  1Q16-2  2Q16-2  3Q16-2  1Qq6-sum  2Qq6-sum  3Qq6-sum
    0  Total  Revenues     100     100     200     100     100     200       200       200       400
    1  Total       EBT     120       0     250     120       0     250       240         0       500
    2  Total  Expenses       0     130       0       0     130       0         0       260         0
    3    CRS  Revenues     200     200     120     200     200     120       400       400       240
    4    CRS       EBT     190     190       0     190     190       0       380       380         0
    5    CRS  Expenses     210     210     190     210     210     190       420       420       380
    

    是吗?

    【讨论】:

    • 好吧,我有很多列。这将非常麻烦。谢谢
    • @postcolonialist 我添加了另一种使用循环的方式,如果你有相同的列名模式
    猜你喜欢
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2016-03-05
    • 1970-01-01
    相关资源
    最近更新 更多