你可以试试:
import csv
from collections import Counter
from itertools import groupby
from operator import itemgetter
with open("data.csv", "r") as fin,
open("result.csv", "w") as fout:
next(fin) # Skip header row
writer = csv.writer(fout)
writer.writerow(["Alphabet", "Value", "Frequency", "%"]) # Write header
for key, group in groupby(csv.reader(fin), key=itemgetter(0)):
frequencies = Counter(map(itemgetter(2), group))
total = 100 / sum(frequencies.values())
writer.writerows(
[key, value, frequency, frequency * total]
for value, frequency in frequencies.items()
)
假设:
-
data.csv 是输入文件。它的第一行包含标题。
- 第一列成组出现。
样本data.csv的结果
Alphabet,Sub alphabet,Value
A,B,1
A,C,1
A,E,2
A,F,3
D,B,1
D,C,2
D,E,2
D,F,3
是
Alphabet,Value,Frequency,%
A,1,2,50.0
A,2,1,25.0
A,3,1,25.0
D,1,1,25.0
D,2,2,50.0
D,3,1,25.0
你也可以使用Pandas:
import pandas as pd
df = pd.read_csv("data.csv")
df = df.groupby(["Alphabet", "Value"], as_index=False).agg(Frequency=("Value", "count"))
df["%"] = df["Frequency"] / df.groupby("Alphabet")["Frequency"].transform("sum") * 100
df.to_csv("result.csv", index=None)
- 首先groupdataframe
dfAlphabet和Value列,计算每组中的项目数,并将生成的新列命名为Frequency.agg。
- 然后通过对每个
Alphabet组规范化Frequency来添加一个新列:通过Alphabet对df进行分组,获取列Frequency,并对值求和。 .transform 确保结果保持其原始形状。然后将 Frequency 列除以结果。
- 最后将
df 写入 csv 文件,不带索引。