对文件中的列执行不同的操作

时间:2019-03-15 23:34:07

标签: python

我试图编写代码来处理我的数字输入文件,然后对它们执行各种操作。例如,第一列是一个名称。第二个是小时费率,第三个是小时数。文件看起来像这样,

John 15 8
Sam 10 4
Mike 16 10
John 19 15

我想经历一下,如果一个名字是重复的(在本例中为John),它将平均第二个数字(每小时的费率),求和第三个数字的总和(小时),并删除重复的,剩下1个John平均工资和总时数。如果不是重复项,则只会输出原始条目。

我无法弄清楚如何跟踪重复项,然后移至该行的下一行。不用使用line.split()有什么方法吗?

5 个答案:

答案 0 :(得分:1)

如果将其分解成多个部分,此问题会更容易。

首先,您想通读文件并将每一行解析为三个变量,即名称,每小时费率和小时数。

第二,您需要处理第一个值(名称)的匹配。您需要某种数据结构来存储值。 dict可能是正确的选择。

第三,您需要在最后计算平均值(由于需要计数值,因此无法一路计算平均值)。

将其放在一起,我会做这样的事情:

class PersonRecord:
    def __init__(self, name):
        self.name = name
        self.hourly_rates = []
        self.total_hours = 0

    def add_record(self, hourly_rate, hours):
        self.hourly_rates.append(hourly_rate)
        self.total_hours += hours

    def get_average_hourly_rate(self):
        return sum(self.hourly_rates) / len(self.hourly_rates)


def compute_person_records(data_file_path):
    person_records = {}

    with open(data_file_path, 'r') as data_file:
        for line in data_file:
            parts = line.split(' ')
            name = parts[0]
            hourly_rate = int(parts[1])
            hours = int(parts[2])

            person_record = person_records.get(name)
            if person_record is None:
                person_record = PersonRecord(name)
                person_records[name] = person_record
            person_record.add_record(hourly_rate, hours)

    return person_records


def main():
    person_records = compute_person_records()

    for person_name, person_record in person_records.items():
        print('{name} {average_hourly_rate} {total_hours}'.format(
            name=person_name,
            average_hourly_rate=person_record.get_average_hourly_rate(),
            total_hours=person_record.total_hours))

if __name__ == '__main__':
    main()

答案 1 :(得分:0)

您可以这样做:

$ perl dummy.pl 10 100 1000 10000
10: 23
100: 2318
1000: 233168
10000: 23331668

答案 2 :(得分:0)

我们在这里。 groupbyname上的aggregate ratehoursmeansum,如下所示。

#assume d is the name of your DataFrame.
d.groupby(by =['name']).agg({'rate': "mean", 'hours':'sum'})

答案 3 :(得分:0)

这不是一个特别有效的版本。我不会在大量数据上运行它,但是它很容易读取并将数据恢复为原始格式,这显然是您想要的...

from statistics import mean

input = '''John 15 8
Sam 10 4
Mike 16 10
John 19 15'''

lines = input.splitlines()
data = [line.split(' ') for line in lines]
names = set([item[0] for item in data])
processed = [(name, str(mean([int(i[1]) for i in data if i[0] == name])), str(sum([int(i[2]) for i in data if i[0] == name]))) for name in names]
joined = [' '.join(p) for p in processed]
line_joined = '\n'.join(joined)

答案 4 :(得分:0)

a=[] #list to store all the values
while(True): #infinite while loop to take any number of values given

    try:  #for giving any number of inputs u want 
        l=input().split()
        a.append(l)
    except(EOFError):
        break;
for i in a: 
    m=[i] #temperory list which will contain duplicate values
    for j in range(a.index(i)+1,len(a)): 
        if(i[0]==a[j][0]):
            m.append(a[j]) #appending duplicates
            a.pop(j) #popping duplicates from main list
    hr=0 #initializing hourly rate and hours with 0
    hrs=0
    if(len(m)>1):
        for k in m:
            hr+=int(k[1])
            hrs+=int(k[2])# calculating total hourly rate and hours
        i[1]=hr/len(m)
        i[2]=hrs/len(m)#finding average
for i in a:
    print(i[0],i[1],i[2]) # printing the final list

阅读代码中的注释以进行代码解释