Python汇总数据具有相同的名称

时间:2014-09-08 18:58:20

标签: python python-2.7

我有一个.csv文件,如下所示:

12/26/2022  AECIZ       516.09  536.37  652.42  528.71  510.65  658.19  566.92  740.25  695.88  574.17  567.22  386.42
12/26/2022  AECIZ       0   0   0   0   0   0   0   0   0   0   0   0
12/26/2022  AECO        657.94  597.16  575.53  545.27  558.24  587.9   627.29  653.44  577.64  528.35  556.93  675.62
12/26/2022  AECO        0   0   0   0   0   0   0   0   0   0   0   0
12/26/2022  AEP         0   0   0   0   0   0   0   0   0   0   198.5   350.5
12/26/2022  AEP         -2852.5 -1585.21    -1201.32    -634.19 -1147.48    -1227.88    -773.48 -633.44 -407.06 -150.65 0   0
12/26/2022  ALTE        187.74  227.4   301.39  252.88  323.56  290.2   314.86  315.52  272.74  241.95  280.06  269.78
12/26/2022  ALTE        0   0   0   0   0   0   0   0   0   0   0   0
12/26/2022  ALTW        760.49  682.41  553.86  405.95  302.72  281.95  359.79  439.3   268.91  14.16   0   0
12/26/2022  ALTW        0   0   0   0   0   0   0   0   0   0   -146.06 -238.28

我想通过分别添加每个元素来组合具有相同名称的行(从第3列开始)

作为python的新用户,我真的不知道如何做到这一点,希望你能帮助我。

好的,这是我到目前为止的代码:

eco_inter = open("Economic_interchange_real.csv")
eco_change = open("Economic_interchange_combine.csv","w")
eco_inter_reader = csv.reader(eco_inter)
company_track = ['','']
new_line = {}
for list_line in eco_inter_reader:
    for date in dates:
        if (list_line[0] == date):
            if (list_line[1] == company_track[1]):
                eco_change.write(list_line[0]+','+list_line[1])
                for j in (range(12)):
                    new_line[j] = list_line[2+j]+company_track[2+j]
                    eco_change.write(','+new_line[j])
                eco_change.write("\n")
            else:
                company_track = list_line
eco_inter.close()
eco_change.close()

它确实将同一家公司与同一日期合并,但数据没有求和,只列在新csv文件的每个单元格中

顺便说一句,日期是一个包含所有日期的列表,如第一栏中的示例所示

2 个答案:

答案 0 :(得分:0)

我认为您需要将所有数字的字符串表示形式转换为实际数字。

new_line[j] = str(float(list_line[2+j]) + float(company_track[2+j]))

目前,您只是连接字符串。如果你能得到它,我也建议你使用熊猫。

答案 1 :(得分:0)

您可以使用字典对具有相同日期和名称的行进行分组:

combined = {} # (date, name) -> [values for each line with this date and name]
with open("Economic_interchange_real.csv", "r") as infile:
    for line in map(str.split, infile):
        date, name, numbers = line[0], line[1], map(float, line[2:])
        # setdefaut: add entry if it does not exist
        combined.setdefault((date, name), []).append(numbers)

现在,对于每个组,您可以zipsum所有值并将这些行写入文件:

with open("Economic_interchange_comb.csv", "w") as outfile:
    for key in combined:
        line = list(key) + map(sum, zip(*combined[key]))
        outfile.write("\t".join(map(str, line)) + "\n")

输出:

12/26/2022  AECO    657.94  597.16  575.53  545.27  558.24  587.9   627.29  653.44  577.64  528.35  556.93  675.62
12/26/2022  ALTW    760.49  682.41  553.86  405.95  302.72  281.95  359.79  439.3   268.91  14.16   -146.06 -238.28
12/26/2022  ALTE    187.74  227.4   301.39  252.88  323.56  290.2   314.86  315.52  272.74  241.95  280.06  269.78
12/26/2022  AECIZ   516.09  536.37  652.42  528.71  510.65  658.19  566.92  740.25  695.88  574.17  567.22  386.42
12/26/2022  AEP -2852.5 -1585.21    -1201.32    -634.19 -1147.48    -1227.88    -773.48 -633.44 -407.06 -150.65 198.5   350.5