Примените операцию к столбцам CSV-файла, исключая заголовки, и обновите результаты в последней строке. - PullRequest
0 голосов
/ 31 августа 2018

У меня есть файл 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.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

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 для добавления, если хотите.

Также обратите внимание, что если вы планируете многократно выполнять эту операцию добавления, она будет очень медленной. В этом случае существуют другие подходы, но для разовых или нескольких раз, добавление в порядке.

0 голосов
/ 01 сентября 2018

при условии, что вам не важен индекс, вы можете использовать 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
...