Сохранение порядка столбцов в Python Pandas DataFrame

20

Есть ли способ сохранить порядок столбцов в файле csv при чтении и писать с Python Pandas? Например, в этом коде

import pandas as pd

data = pd.read_csv(filename)
data.to_csv(filename)

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

    
задан Hernan 27.03.2013 в 08:27
источник
  • Можете ли вы привести пример своего csv? –  waitingkuo 27.03.2013 в 09:09

3 ответа

17

В текущей версии Pandas ('0.11.0') появляется ошибка, что означает, что ответ Матти Джона не будет работать. Если вы указываете столбцы для записи в файл, они записываются в алфавитном порядке, а просто перемаркированы в соответствии с списком в столбцах. Например, этот код:

import pandas
dfdict={}
dfdict["a"]=[1,2,3,4]
dfdict["b"]=[5,6,7,8]
dfdict["c"]=[9,10,11,12]
df=pandas.DataFrame(dfdict)
df.to_csv("dfTest.txt","\t",header=True,cols=["b","a","c"])

приводит к этому (неправильному) выводу:

    b   a   c
0   1   5   9
1   2   6   10
2   3   7   11
3   4   8   12

Вы можете проверить, какую версию панд вы установили, выполнив:

pandas.version.version

Документация для to_csv здесь

На самом деле кажется, что это известная ошибка и будет исправлена ​​в предстоящем выпуске (0.11.1):

Ссылка

UPDATE: до сих пор не было новой версии pandas, но здесь описан обходной путь, который не требует использования другой версии pandas:

github.com/pydata/pandas/issues/3454

Таким образом, изменение последней строки в блоке вышеприведенного кода будет работать правильно:

df.to_csv("dfTest.txt","\t",header=True,cols=["b","a","c"], engine='python')

UPDATE кажется, что аргумент «cols» был переименован в «столбцы» и что аргумент «engine» устарел (больше не доступен) в последних версиях pandas. Кроме того, эта ошибка исправлена ​​в версии 0.19.0.

    
ответ дан CnrL 06.06.2013 в 11:28
источник
  • Попытка этого решения с недавними пандами (0.19.2) дает: TypeError: to_csv () получил неожиданный аргумент ключевого слова 'cols' изменил API? –  arielf 23.03.2017 в 00:50
  • считают, что этот вариант устарел, поскольку больше не нужен. –  CnrL 23.03.2017 в 07:03
  • Кажется, он был переименован в столбцы. Теперь для меня работает изменение столбцов на столбцы. –  arielf 24.03.2017 в 06:25
12

Порядок чтения столбцов обычно должен сохраняться при чтении, а затем записывать такой файл csv, но если по какой-то причине они не в том порядке, в котором вы хотите, вы можете использовать аргумент ключевого слова columns в to_csv .

Например, если у вас есть csv с столбцами a, b, c, d:

data = pd.read_csv(filename)
data.to_csv(filename, columns=['a', 'b', 'c', 'd'])
    
ответ дан Matti John 27.03.2013 в 13:24
источник
5

Другим обходным решением является следующее:

import pandas as pd
data = pd.read_csv(filename)
data2 = df[['A','B','C']]  #put 'A' 'B' 'C' in the desired order
data2.to_csv(filename)
    
ответ дан Lawrence Chernin 28.01.2016 в 03:22
источник
  • Это было единственное решение, которое сработало для меня. Вы могли бы сократить строку кода путем переупорядочения и создания CSV всего за один шаг. –  Mtap1 15.09.2016 в 18:59