【问题标题】:How can I get the frequency and its percentage in the same row as alphabet and sub alphabet?如何在与字母表和子字母表相同的行中获取频率及其百分比?
【发布时间】:2022-12-19 17:23:58
【问题描述】:

我想在与字母表和子字母表相同的行中获取频率及其百分比。

我有一个 .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%
A 2 1 25%
A 3 1 25%
D 1 1 25%
D 2 2 50%
D 3 1 25%

上面可信预期的表格是不言自明的。百分比是指相应行的频率除以总频率。

我的代码:

import csv

with open("/Users/name/Desktop/path/alphabetical_list.csv") as alphabetical_list_file:
    csv_reader = csv.reader(alphabetical_list_file, delimiter=',')

如果您需要更多信息,请随时发表评论。

如何获得频率及其百分比?我将不胜感激任何帮助。先感谢您!

【问题讨论】:

    标签: python


    【解决方案1】:

    你可以试试:

    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)
    
    • 首先groupdataframedfAlphabetValue列,计算每组中的项目数,并将生成的新列命名为Frequency.agg
    • 然后通过对每个Alphabet组规范化Frequency来添加一个新列:通过Alphabetdf进行分组,获取列Frequency,并对值求和。 .transform 确保结果保持其原始形状。然后将 Frequency 列除以结果。
    • 最后将 df 写入 csv 文件,不带索引。

    【讨论】:

    • 您好感谢您的回答!您的答案代码有效!再次感谢!
    • 你好,我是 pandas 的新手,你能解释一下你的 pandas 代码是什么意思吗?
    • @MyCar 我添加了一些解释并希望它们有所帮助。 (有点通用,但只有少数 Pandas 技术需要学习才能从库中获得全部价值。其中包括 groupbyaggtransform 的组合。)
    猜你喜欢
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多