pd.to_csv set float_format со списком - PullRequest
0 голосов
/ 12 июня 2018

Мне нужно записать df в текстовый файл, чтобы сэкономить место на диске, я хотел бы установить количество десятичных разрядов для каждого столбца, т.е. иметь каждый столбец разной ширины.

Я пробовал:

df = pd.DataFrame(np.random.random(size=(10, 4)))
df.to_csv(path, float_format=['%.3f', '%.3f', '%.3f', '%.10f']) 

Но это не работает;

TypeError: неподдерживаемые типы операндов для%: 'list' и 'float'

Любые предложения о том, как сделать это с пандами (версия 0.23.0)

Ответы [ 4 ]

0 голосов
/ 12 июня 2018

Спасибо за все ответы, вдохновленные @Joe, я придумал:

df = df.round({'a':3, 'b':3, 'c':3, 'd':10})

или более обобщенно

df = df.round({c:r for c, r in zip(df.columns, [3, 3, 3, 10])})

Это обходной путь и не отвечает на оригинальный вопрос, round изменяет базовый фрейм данных, что может быть нежелательно.

0 голосов
/ 12 июня 2018

Обычно я делаю это так:

a['column_name'] = round(a['column_name'], 3)

И затем вы можете экспортировать его в CSV, как обычно.

0 голосов
/ 12 июня 2018

Вы можете использовать applymap , которое применяется ко всем значениям строк и столбцов.

df = pd.DataFrame(np.random.random(size=(10, 4)))
df.applymap(lambda x: round(x,2))

Out[58]: 
      0     1     2     3
0  0.12  0.63  0.47  0.19
1  0.06  0.81  0.09  0.56
2  0.78  0.85  0.42  0.98
3  0.58  0.39  0.73  0.68
4  0.79  0.56  0.77  0.34
5  0.16  0.20  0.94  0.89
6  0.34  0.79  0.54  0.27
7  0.70  0.58  0.05  0.28
8  0.75  0.53  0.37  0.64
9  0.57  0.68  0.59  0.84
0 голосов
/ 12 июня 2018

Вы можете сделать так:

 df.iloc[:,0:3] = df.iloc[:,0:3].round(3)
 df['d'] = df['d'].round(10)
 df.to_csv('path')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...