【问题标题】:Sum of values in each row of DataFrameDataFrame 每一行的值的总和
【发布时间】:2020-08-14 19:05:15
【问题描述】:

我有一个 100 行只有一列的 csv 文件。每一行都有很多值,我想找到这些值的总和,但每一行都被视为一个大整数。

如何将我的大型数据集(分隔符?)拆分为单独的列,或者将每行中的每个值相加而无需拆分?

例如。我的文件现在的样子

A     1100100101000112012110011
B     0000010100011000002000111
C     0010100000011000000101110
D     1100000110001011001001100
E     0000210000000000000010010

我想要的样子:

                                    SUM
A     1100100101000112012110011     16
B     0000010100011000002000111     9
C     0010100000011000000101110     8
D     1100000110001011001001100     10
E     0000210000000000000010010     5

我目前无法得到总和,因为每一行都被视为一个大数字。

【问题讨论】:

    标签: python list dataframe split sum


    【解决方案1】:

    .apply内的代码说明

    • vals 列中的每个值都是str 类型,而不是数字。
    • 使用list() 会将字符串分隔成一个列表
    ex = list('1100100101000112012110011')
    
    # print(ex)
    [out]:
    ['1', '1', '0', '0', '1', '0', '0', '1', '0', '1', '0', '0', '0', '1', '1', '2', '0', '1', '2', '1', '1', '0', '0', '1', '1']
    
    • 每个值都必须用map转换成int,然后才能对列表求和。
    print(list(map(int, ex)))
    [out]:
    [1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 2, 0, 1, 2, 1, 1, 0, 0, 1, 1]
    

    读取 csv 并转换列的代码

    import pandas as pd
    
    # given the sample csv
    df = pd.read_csv('test.csv', sep='\\s+', header=None)
    df.rename(columns={0: 'ID', 1: 'vals'}, inplace=True)
    
    # transform the column with apply
    df['SUM'] = df.vals.apply(lambda x: sum(map(int, list(x))))
    
    # display(df)
      ID                       vals  SUM
    0  A  1100100101000112012110011   16
    1  B  0000010100011000002000111    9
    2  C  0010100000011000000101110    8
    3  D  1100000110001011001001100   10
    4  E  0000210000000000000010010    5
    
    # save the df
    df.to_csv('test.csv', index=False)
    

    【讨论】:

      【解决方案2】:

      使用列表理解的替代解决方案:

      df['SUM'] = df.vals.map(lambda x: sum([int(i) for i in x]))
      
      

      结果df:

        id                       vals  SUM
      0  A  1100100101000112012110011   16
      1  B  0000010100011000002000111    9
      2  C  0010100000011000000101110    8
      3  D  1100000110001011001001100   10
      4  E  0000210000000000000010010    5
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-03
        • 1970-01-01
        • 2019-03-24
        • 2014-03-05
        • 2019-12-28
        • 2016-03-22
        • 2019-06-14
        相关资源
        最近更新 更多