代码之家  ›  专栏  ›  技术社区  ›  jovicbg

遍历dataframe中的列表并汇总其他列

  •  1
  • jovicbg  · 技术社区  · 7 年前

    我有一件棘手的事要做。

    Side_a  childs                             column1
    1001     NaN                                  3
    1002     ['1001']                             5
    1003     ['1001']                             3
    1004     ['1001,'1003']                       6 
    1005     ['1001', '1002', '1003', '1004']     13
    1006     ['1003', '1004']                     8
    

    第2栏应该是:

    side_a          childs                            column1  column2
    1001       NaN                                      3         3
    1002       ['1001']                                 5         8
    1003       ['1001']                                 3         6
    1004       ['1001','1003']                          6         12
    1005       ['1001', '1002', '1003', '1004']         13        30
    1006       ['1003', '1004']                         8         17 
    

    说实话,我不知道从哪里开始,怎么开始,所以任何暗示都是很受欢迎的。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Franco Piccolo    7 年前

    您可以使用 loc . 最后你用 apply 使用自定义函数聚合列,如:

    def row_agg(row):
        column1 = row['column1']
        childs = df.loc[row['childs']]['column1'].sum() if isinstance(row['childs'],list) else 0
        return column1 + childs
    
    df = df.set_index('Side_a')
    df['column2'] = df.apply(row_agg, axis=1)
    
    df
    
        childs  column1 column2
    Side_a          
    A   NaN         3   3
    B   [A]         5   8
    C   [A]         3   6
    D   [A, C]      6   12
    E   [A, B, C, D]13  30
    F   [C, D]      8   17
    
        2
  •  1
  •   Lukas Thaler    7 年前

    df 在上面的输入数据帧中,下面的代码生成所需的输出

    df.index = [str(x) for x in df['side_a']]
    df['column2'] = df['column1'] + [sum(df['column1'].loc[df['childs'][i]]) if isinstance(df['childs'][i], list) else 0 for i in range(df.shape[0])]