【问题标题】:How to find a median from a list of values如何从值列表中找到中位数
【发布时间】:2021-08-10 17:32:32
【问题描述】:

我将 CSV 文件导出到 Python 并将其组织成列表。 我需要打印“Premium”类别的“Median”克拉(黄色标记)。

这是我的代码:

diamonds_file = open('diamonds.csv', 'r')
lines = diamonds_file.readlines()
table=[]
for i in range(len(lines)):
    lines[i]=lines[i].replace('\n', '')
    splitted_line=lines[i].split(',')
    print(splitted_line)

请看上面这段代码的附加输出:

【问题讨论】:

  • 我不明白您在尝试执行此操作时遇到了什么问题。请详细说明。
  • 通常,为了找到列表的中值,对列表进行排序并取中间索引。
  • 我不知道如何找到高级类钻石的克拉中值
  • 你知道如何找到优质钻石吗?
  • 那你问了一个比前一步(或更多)的问题。

标签: python csv dictionary


【解决方案1】:

我希望你可以使用外部库。

import statistics
diamonds_file = open('diamonds.csv', 'r')
lines = diamonds_file.readlines()
table=[]
values=[]
for i in range(len(lines)):
    lines[i]=lines[i].replace('\n', '')
    splitted_line=lines[i].split(',')
    if splitted_line[1] == '"Premium"':   
        values.append(float(splitted_line[0]))
print(statistics.median(values))

没有外部库。

diamonds_file = open('diamonds.csv', 'r')
lines = diamonds_file.readlines()
table=[]
values=[]
n = 0
for i in range(len(lines)):
    lines[i]=lines[i].replace('\n', '')
    splitted_line=lines[i].split(',')
    if splitted_line[1] == '"Premium"':   
        values.append(float(splitted_line[0]))
        n += 1
print(sum(values)/n)

【讨论】:

    【解决方案2】:

    将 csv 读入 pandas...

    import pandas as pd
    
    df = pd.read_csv('diamonds.csv')
    

    如果 csv 没有标题,则按索引号选择列(这是我在下面所做的)或重命名列...并继续。

    df_Premium = df[df[1] == 'Premium']
    stats = df_Premium.describe()
    display(stats)
    

    中位数将在打印出来的统计数据中。

    【讨论】:

      【解决方案3】:

      请使用 Pandas 库,它是一个数据分析库。

      import pandas as pd
      df = pd.read_csv("diamonds.csv")
      

      您可以看到存储在数据框df 中的统一表。 现在你想要一个特定指标的median

      df.groupby('cut').median()
      

      显示所有数值指标的中位数。
      现在,指出您需要的特定列:

      df.groupby('cut').median()['cart']
      

      【讨论】:

        【解决方案4】:
        def premiummedian(splitted_line):
            premium_carat=[]
            n=0
            for line in splitted_line:
                if line[1]=="Premium":
                    premium_carat.append(float(line[0]))
                    n+=1
            # not sure if you have to sort for median. If yes then
            #remove comment from the line below this
            premium_carat.sort()
            if n%2==0:# if length is even then return the middle element
                return premium_carat[n//2]
            else:#if length is odd then return the avg of 2 elements at the middle
                return (premium_carat[n//2]+premium_carat[(n//2)+1])/2
        

        【讨论】:

        • 我从 vscode 复制粘贴,它不允许我正确发布。
        • 是的,您只需正确使用编辑器即可。见meta.stackoverflow.com/questions/251361/…
        • 感谢您的帮助:)
        • @RitikAttri- 我试图运行你的代码,但它没有输出。另外,我不需要对中位数进行排序。我需要找到高级削减类别的中位数。此外,我的 CSV 文件包含标题:克拉、切割、颜色、清晰度
        • 我不明白,因为我在您的输出图像中使用了相同的列表,它似乎有效。请确保您在函数中发送 splitted_lines 并且您正在返回函数返回的内容,而不仅仅是调用它并保留它:) 我只是更改了类型对不起我完全错过了数字是一个字符串。
        猜你喜欢
        • 2020-06-06
        • 2021-03-17
        • 2014-06-01
        • 2021-08-10
        • 2021-06-23
        • 2012-04-25
        • 2021-11-11
        • 2016-03-21
        • 2021-12-19
        相关资源
        最近更新 更多