Python CSV将每行数字的所有排列组合成元组

2024-06-26 13:48:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python很在行,但是在学习。我在工作中的任务是以以下格式获取数据的CSV(2500行)(因为我们无法在Excel中实现):

 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   

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

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。在

基本上,我想制作的是:

^{pr2}$

但是我想为了显示元组中的数字计数,我可以运行它9次(最多有12条评论),并且每个数据表都在自己的选项卡上。在

从技术上讲,我还需要每个元组的标准差和分数范围,但这已经超出了我的专业知识,所以我想我可以放弃它,或者以某种方式手动操作。在

你知道从哪里开始吗?在


Tags: csv格式评论数字excel数据表平均值计数
3条回答

我对最后一个答案投了赞成票,但我想我会给您展示一个将所有内容都保存在数据帧中的示例

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])

您可以使用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))

相关问题 更多 >