对不包括标题的CSV文件列应用操作,并在最后一行更新结果

问题描述 投票:0回答:2

我有一个像这样创建的CSV文件:

keep_same;get_max;get_min;get_avg
1213;176;901;517
1213;198;009;219
1213;898;201;532

现在我想将第四行附加到现有的CSV文件中,如下所示:

First column: Remains same: 1213
Second column: Get max value: 898
Third column: Get min value: 009
Fourth column: Get avg value: 422.6

所以最终的CSV文件应该是:

keep_same;get_max;get_min;get_avg
1213;176;901;517
1213;198;009;219
1213;898;201;532
1213;898;009;422.6

请帮我实现同样的目标。使用Pandas不是强制性的。

提前致谢!

python pandas csv python-3.6
2个回答
0
投票

假设您不关心索引,可以使用loc[-1]添加行:

df = pd.read_csv('file.csv', sep=';', dtype={'get_min':'object'}) # read csv set dtype to object for leading 0 col
row = [df['keep_same'].values[0], df['get_max'].max(), df['get_min'].min(), df['get_avg'].mean()] # create new row
df.loc[-1] = row # add row to a new line
df['get_avg'] = df['get_avg'].round(1) # round to 1
df['get_avg'] = df['get_avg'].apply(lambda x: '%g'%(x)) # strip .0 from the other records
df.to_csv('file1.csv', index=False, sep=';') # to csv file

出:

keep_same;get_max;get_min;get_avg
1213;176;901;517
1213;198;009;219
1213;898;201;532
1213;898;009;422.7

1
投票

df.agg(...)接受一个dict,其中dict键是列的名称,值是执行所需聚合的字符串:

df_agg = df.agg({'keep_same': 'mode', 'get_max': 'max',
                 'get_min': 'min', 'get_avg': 'mean'})[df.columns]

生产:

   keep_same  get_max  get_min     get_avg
0       1213      898        9  422.666667

然后你只需将df_agg附加到df

df = df.append(df_agg, ignore_index=False)

结果:

   keep_same  get_max  get_min     get_avg
0       1213      176      901  517.000000
1       1213      198        9  219.000000
2       1213      898      201  532.000000
0       1213      898        9  422.666667

请注意,附加行的索引是0。如果你愿意,你可以通过ignore_index=True追加。

另请注意,如果您计划进行大量的追加操作,则会非常慢。在这种情况下确实存在其他方法,但是对于一次性或仅仅几次,追加是可以的。

© www.soinside.com 2019 - 2024. All rights reserved.