代码之家  ›  专栏  ›  技术社区  ›  Hariom Singh

基于列的Panda求和

  •  2
  • Hariom Singh  · 技术社区  · 7 年前

    对于下面的数据框,我试图找出一些基于文件名的代码行

        Blank Lines  Code Lines  Comment Lines Filename  Language  \
    28            3          18              3   Repo_3     Maven   
    50            2           8              1   Repo_3    Python   
    16            8          25              5   Repo_3      Java   
    14            6          26              0   Repo_3         C   
    27            4          19              0   Repo_3         C   
    30            6          18              8   Repo_3    Python   
    11           10          33             23   Repo_3    Python   
    46            2           9              2   Repo_3       C++   
    23            0          20              6   Repo_3      YAML   
    52            1           4              1   Repo_3      Java   
    6            23          39              0   Repo_3  Markdown   
    24            4          20              5   Repo_3         C   
    3             5          42              3   Repo_3      Java   
    55            1           3              2   Repo_3      Java   
    35            3          16             15   Repo_3       C++   
    34            4          17              1   Repo_2      Java   
    1             0          53              0   Repo_2       XML   
    31            6          18              8   Repo_2    Python   
    33            4          17              1   Repo_2      Java   
    29            3          18              3   Repo_2       XML   
    36            3          16             15   Repo_2       C++   
    41            5          12              2   Repo_2      make   
    44            2           9              2   Repo_2       C++   
    48            2           8              1   Repo_2    Python   
    53            4           4              0   Repo_2  Markdown   
    54            1           4              1   Repo_2      Java   
    43            5          12              2   Repo_2      make   
    57            1           3              2   Repo_2      Java   
    26            4          19              0   Repo_2         C   
    18            6          23              1   Repo_2      Java   
    2             5          42              3   Repo_2      Java   
    5            23          39              0   Repo_2  Markdown   
    8            10          33             23   Repo_2    Python   
    10            0          33              0   Repo_2     Maven   
    17            8          25              5   Repo_2      Java   
    13            6          26              0   Repo_2         C   
    21            4          20              5   Repo_2         C   
    20            4          20             14   Repo_2      Java   
    19            4          23              0   Repo_1         C   
    9            10          33             23   Repo_1    Python   
    56            1           3              2   Repo_1      Java   
    22            4          20              5   Repo_1         C   
    4             5          42              3   Repo_1      Java   
    7            23          39              0   Repo_1  Markdown   
    51            1           4              1   Repo_1      Java   
    32            3          18              3   Repo_1     Maven   
    49            3           8              0   Repo_1         C   
    47            2           8              1   Repo_1    Python   
    37            8          16              4   Repo_1         C   
    45            2           9              2   Repo_1       C++   
    12            6          26              0   Repo_1         C   
    25            4          19              0   Repo_1         C   
    42            5          12              2   Repo_1      make   
    15            8          25              5   Repo_1      Java   
    40            5          12              2   Repo_1      make   
    39            3          15              0   Repo_1         C   
    38            3          16             15   Repo_1       C++   
    0             0          53              0   Repo_1       XML  
    

    像这样的东西

      Filename  Total Code Lines
      Repo_3      3445
      Repo_2      2323
      Repo_1      1134
    

    我试过下面的代码

    listofRepo = locPd['Filename'].unique()
    print(listofRepo)
    print(locPd)
    
    for repo in listofRepo:
        sums = locPd[locPd['Filename'] == repo].groupby(['Filename', 'Code Lines'], as_index=False).sum()
        Total_Loc = sums['Code Lines'].sum()
        print(sums)
        print("Total_Loc of " + str(repo) + " is " + str(Total_Loc))
    

    总数是错误的,因为桌子上的任何建议都弄乱了

    ['Repo_3' 'Repo_2' 'Repo_1']
       Filename  Code Lines  Blank Lines  Comment Lines
    0    Repo_3           3            1              2
    1    Repo_3           4            1              1
    2    Repo_3           8            2              1
    3    Repo_3           9            2              2
    4    Repo_3          16            3             15
    5    Repo_3          18            9             11
    6    Repo_3          19            4              0
    7    Repo_3          20            4             11
    8    Repo_3          25            8              5
    9    Repo_3          26            6              0
    10   Repo_3          33           10             23
    11   Repo_3          39           23              0
    12   Repo_3          42            5              3
    13   Repo_3          53            0              0
    Total_Loc of Repo_3 is 315
       Filename  Code Lines  Blank Lines  Comment Lines
    0    Repo_2           3            1              2
    1    Repo_2           4            5              1
    2    Repo_2           8            2              1
    3    Repo_2           9            2              2
    4    Repo_2          12           10              4
    5    Repo_2          16            3             15
    6    Repo_2          17            8              2
    7    Repo_2          18            9             11
    8    Repo_2          19            4              0
    9    Repo_2          20            8             19
    10   Repo_2          23            6              1
    11   Repo_2          25            8              5
    12   Repo_2          26            6              0
    13   Repo_2          33           10             23
    14   Repo_2          39           23              0
    15   Repo_2          42            5              3
    16   Repo_2          53            0              0
    Total_Loc of Repo_2 is 367
       Filename  Code Lines  Blank Lines  Comment Lines
    0    Repo_1           3            1              2
    1    Repo_1           4            1              1
    2    Repo_1           8            5              1
    3    Repo_1           9            2              2
    4    Repo_1          12           10              4
    5    Repo_1          15            3              0
    6    Repo_1          16           11             19
    7    Repo_1          18            3              3
    8    Repo_1          19            4              0
    9    Repo_1          20            4              5
    10   Repo_1          23            4              0
    11   Repo_1          25            8              5
    12   Repo_1          26            6              0
    13   Repo_1          33           10             23
    14   Repo_1          39           23              0
    15   Repo_1          42            5              3
    Total_Loc of Repo_1 is 312
    

    添加的问题 有没有办法在回购协议1中添加文件数量或文件计数,而不是重复和按列添加

    len(df[df['Filename'].str.contains(repo)]
    
    3 回复  |  直到 7 年前
        1
  •  6
  •   jezrael    7 年前

    在我看来,循环是不必要的。

    可以在中指定列 list 对于聚合:

    df = locPd.groupby('Filename', as_index=False)['Code Lines'].sum()
    print (df)
      Filename  Code Lines
    0   Repo_1         401
    1   Repo_2         471
    2   Repo_3         300
    

    如果要聚合所有数字列:

    df1 = locPd.groupby('Filename', as_index=False).sum()
    print (df1)
      Filename  Blank Lines  Code Lines  Comment Lines
    0   Repo_1          100         401             68
    1   Repo_2          110         471             89
    2   Repo_3           78         300             74
    

    为了得到 count s是可能的用途 DataFrameGroupBy.agg :

    df1 = (locPd.groupby('Filename')['Code Lines']
                .agg([('tot', 'sum'),('count', 'size')])
                .reset_index())
    print (df1)
      Filename  tot  count
    0   Repo_1  401     20
    1   Repo_2  471     23
    2   Repo_3  300     15
    
        2
  •  2
  •   John Zwinck    7 年前

    你应该 groupby('Filename') . 然后它会做你想做的。

        3
  •  1
  •   sandeep rathore    7 年前

    您还可以使用下面的代码根据文件名列获取列的总和。 文件计数=xl.groupby(['Filename']).sum()
    打印(文件计数)

    enter image description here