Python-CSV-将每行数字排列成元组

Python-CSV-将每行数字排列成元组,python,Python,我是Python的新手,但我正在学习。我的任务是以以下格式获取CSV数据(2500行)(因为我们不知道如何在Excel中执行此操作): 并生成一个CSV,其中包含您可以从每行获得的所有数字排列的平均值(最少3个) i、 e 上面的3841/1将生成{4,3,1}的元组,平均值为2.7 3402/1以上将产生{4,3,1}、{4,3,1,5}、{3,1,5}、{4,1,5}等元组,平均值为2.7、3.3、3、3.3等 我绞尽脑汁想办法做到这一点,因为我还需要知道每一个平均数,它包含了多少个元组中的

我是Python的新手,但我正在学习。我的任务是以以下格式获取CSV数据(2500行)(因为我们不知道如何在Excel中执行此操作):

并生成一个CSV,其中包含您可以从每行获得的所有数字排列的平均值(最少3个)

i、 e

上面的3841/1将生成{4,3,1}的元组,平均值为2.7

3402/1以上将产生{4,3,1}、{4,3,1,5}、{3,1,5}、{4,1,5}等元组,平均值为2.7、3.3、3、3.3等

我绞尽脑汁想办法做到这一点,因为我还需要知道每一个平均数,它包含了多少个元组中的数字,即{4,3,1}将产生2.7的平均数,该元组的数字计数是3

基本上,我想要制作的是:

RefNumber      Avg 1     Avg 2       Avg 3       Avg 4   Avg 5
  3841/1        2.7         
  3402/1        2.7       3.3           3         3.5   
但我想,为了显示元组中的数字计数,我可以运行它9次(最多有12次评论),然后将每个数据表放在自己的选项卡上

从技术上讲,我还需要每个元组的标准偏差和分数范围,但这已经远远超过了我的专业知识,所以我想我可以放弃它,或者手动完成


您知道从哪里开始吗?

您可以使用csv模块读取csv并提取数据,使用itertools模块获取所有组合。看看它是否能完成任务。另外,我保留了平均值,但我看到您只使用了1个小数点,通过对结果进行四舍五入可以很容易地得到。我想你现在可以保存结果了

from itertools import combinations as cb 
import csv
with open("test.csv") as f:
    reader=csv.reader(f)
    next(reader, None)  # skip header
    data=[filter(None,i) for i in reader]

def avgg(x):
    ll=[float(i) for i in x[1:]] #take review no and convert to float
    n=len(ll)
    avg_list=[x[0]]  #start result list with ref no.
    for i in range(3,n+1):
        for j in cb(ll,i):
            # print(j)  #see the combination
            avg_list.append(sum(j)/i)
    return avg_list

for x in data:
    print(avgg(x))

您可以使用csv模块读取csv并提取数据,使用itertools模块获取所有组合。看看它是否能完成任务。另外,我保留了平均值,但我看到您只使用了1个小数点,通过对结果进行四舍五入可以很容易地得到。我想你现在可以保存结果了

from itertools import combinations as cb 
import csv
with open("test.csv") as f:
    reader=csv.reader(f)
    next(reader, None)  # skip header
    data=[filter(None,i) for i in reader]

def avgg(x):
    ll=[float(i) for i in x[1:]] #take review no and convert to float
    n=len(ll)
    avg_list=[x[0]]  #start result list with ref no.
    for i in range(3,n+1):
        for j in cb(ll,i):
            # print(j)  #see the combination
            avg_list.append(sum(j)/i)
    return avg_list

for x in data:
    print(avgg(x))

我对最后一个答案投了赞成票,但我想我给大家展示了一个例子,它将所有内容都保存在数据框架中

data = """RefNumber, Reviewer 1, Reviewer 2,Reviewer 3,Reviewer 4,Reviewer 5
9676/2,6,3,2,,
0526/4,6,3,1,5,1
1842/1,5,3,1,5,
2693/3,5,5,1,2,
2515/1,6,3,1,5,3
2987/1,4,1,3,,
3841/1,4,3,1,,
3402/1,4,3,1,5,
"""

import pandas
import itertools
import StringIO
import numpy

buffer = StringIO.StringIO(data)
df = pandas.read_csv(buffer, index_col=0)

# EVERYTHING ABOVE IS MOSTLY SETUP CODE FOR THE EXAMPLE
def get_combos(items, lower_bound=3):
    """
    Return all combinations of values of size lower_bound
    for items
    """
    usable = items.dropna()
    combos = list()
    n_combos = range(lower_bound, len(usable) + 1)
    for r in n_combos:
        combos += list(itertools.combinations(usable, r))
    return combos

df['combos'] = df.apply(get_combos, axis=1)
df['means'] = df['combos'].map(lambda items: [numpy.mean(x) for x in items])

我对最后一个答案投了赞成票,但我想我给大家展示了一个例子,它将所有内容都保存在数据框架中

data = """RefNumber, Reviewer 1, Reviewer 2,Reviewer 3,Reviewer 4,Reviewer 5
9676/2,6,3,2,,
0526/4,6,3,1,5,1
1842/1,5,3,1,5,
2693/3,5,5,1,2,
2515/1,6,3,1,5,3
2987/1,4,1,3,,
3841/1,4,3,1,,
3402/1,4,3,1,5,
"""

import pandas
import itertools
import StringIO
import numpy

buffer = StringIO.StringIO(data)
df = pandas.read_csv(buffer, index_col=0)

# EVERYTHING ABOVE IS MOSTLY SETUP CODE FOR THE EXAMPLE
def get_combos(items, lower_bound=3):
    """
    Return all combinations of values of size lower_bound
    for items
    """
    usable = items.dropna()
    combos = list()
    n_combos = range(lower_bound, len(usable) + 1)
    for r in n_combos:
        combos += list(itertools.combinations(usable, r))
    return combos

df['combos'] = df.apply(get_combos, axis=1)
df['means'] = df['combos'].map(lambda items: [numpy.mean(x) for x in items])

关于子集生成的相关问答:


关于子集生成的相关问答:


我认为
子集
置换
更合适。置换集的平均值是常量。从读取数据开始,例如,使用子集是否有效?我认为一个子集只会产生该行上所有数字的集合,也就是说,如果该行包含8个数字,那么它将是8个数字的子集,而我想要3和8之间的所有组合?啊,是的,我不想要重复,即{4,3,1}与{1,3,4}相同,所以我只想要其中一个。嗯,回到绘图板上:/确切地说,这是一个组合(集合)但两个排列(元素的顺序不同)。我认为
子集
排列
更合适。置换集的平均值是常量。从读取数据开始,例如,使用子集是否有效?我认为一个子集只会产生该行上所有数字的集合,也就是说,如果该行包含8个数字,那么它将是8个数字的子集,而我想要3和8之间的所有组合?啊,是的,我不想要重复,即{4,3,1}与{1,3,4}相同,所以我只想要其中一个。嗯,回到绘图板上:/确切地说,这是一个组合(集合)但两个排列(元素的顺序不同)。非常感谢您,这非常有效!我需要想办法知道哪些数字适用于元组中的多少个数字,但我想我可以在for循环中添加一些文本!:)。。。。。老实说,我对你感激不尽。我本来打算花一两个星期来做这个!不用客气,现在我想你可以很容易地从这些组合中得到标准偏差和其他结果。非常感谢你,这非常有效!我需要想办法知道哪些数字适用于元组中的多少个数字,但我想我可以在for循环中添加一些文本!:)。。。。。老实说,我对你感激不尽。我本来打算花一两个星期来做这个!不客气,现在我想你可以很容易地从组合中得到标准偏差和其他结果。非常感谢链接:)非常感谢链接:)