对于以下数据框df
Filename Language
Repo/Repo_3/.travis.yml YAML 20
Repo/Repo_3/backup_automater_services.py Python 18
Repo/Repo_3/batch_file_rename.py Python 33
Repo/Repo_3/cbd_pennies. C 26
Repo/Repo_3/cbd_rand. C 19
Repo/Repo_3/cbd_rand_dist. C 20
Repo/Repo_3/chaos.py Python 8
Repo/Repo_3/chapter02/item01/Provider.jav Java 4
Repo/Repo_3/chapter02/item01/Service.jav Java 3
Repo/Repo_3/chapter02/item01/Services.jav Java 25
试图找到一种方法来查找语言列中重复项的总和。 所有C语言或Python的总和
Filename Language Sum of All
Repo/Repo_3 YAML 20
Repo/Repo_3 Python 118
Repo/Repo_3 C 120
Repo/Repo_3 Java 125
尝试使用groupby但没有运气
df.groupby(['Filename', 'Language'])['Code Lines'].sum()
答案 0 :(得分:1)
您要分组的Filename
与您要合并的行不同。您或者要从groupby
中删除该列,或者添加一个新列,该列对于所有行都是 。
仅针对您显示的数据框:
df.groupby(['Language']).sum()
Code Lines
Language
C 65
Java 32
Python 59
YAML 20
apply
语句在每个文件上用/
分割名称,并仅重新连接前两个单词,因此,如果整个数据框未遵循该约定,请根据需要进行调整。
并添加一个新列:
df['Repo'] = df['Filename'].apply(lambda st: '/'.join(st.split('/')[:2]))
df.groupby(['Repo', 'Language']).sum()
Code Lines
Repo Language
Repo/Repo_3 C 65
Java 32
Python 59
YAML 20
答案 1 :(得分:1)
使用groupby
很简单。但是,当您在另一列上进行汇总时,打算如何保留文件名?
我建议使用os.path.split
从文件名中提取绝对目录路径,并按文件名和语言分组。
import os
(df.assign(Filename=[os.path.split(v)[0] for v in df.Filename])
.groupby(['Filename', 'Language'])
.sum()
.reset_index())
Filename Language Value
0 Repo/Repo_3 C 65
1 Repo/Repo_3 Python 59
2 Repo/Repo_3 YAML 20
3 Repo/Repo_3/chapter02/item01 Java 32