читать csv в df с другим порядком столбцов

У MySQL нет внутреннего типа данных типа boolean. Он использует наименьший целочисленный тип данных - TINYINT.

BOOLEAN и BOOL являются эквивалентами TINYINT (1), поскольку они являются синонимами.

Попробуйте создать эту таблицу -

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

Затем запустите SHOW CREATE TABLE, вы получите этот выход -

CREATE TABLE `table1` (
  `column1` tinyint(1) DEFAULT NULL
)
0
задан Mor Zamir 17 January 2019 в 13:31
поделиться

3 ответа

Я думаю, что read_csv не может этого сделать, идея с usecols также не работает:

import pandas as pd

temp=u"""D;B;A;C
0;a;4;7;1
1;b;5;8;3
2;c;4;9;5
3;d;5;4;7
4;e;5;2;1
5;f;4;3;0"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), sep=";", usecols=['A', 'B', 'C', 'D'])
print (df)
   D  B  A  C
0  0  a  4  7
1  1  b  5  8
2  2  c  4  9
3  3  d  5  4
4  4  e  5  2
5  5  f  4  3

Решение - изменить порядок по списку или по индексу сортировки:

[ 111] <час>
df = df.sort_index(axis=1)
print (df)
   A  B  C  D
0  4  a  7  0
1  5  b  8  1
2  4  c  9  2
3  5  d  4  3
4  5  e  2  4
5  4  f  3  5
0
ответ дан jezrael 17 January 2019 в 13:31
поделиться

Один из методов заключается в том, чтобы читать по одному столбцу за раз и сохранять в виде списка и concat результат:

In[121]:
t="""D,B,A,C
4,2,1,3"""
cols = list('ABCD')
pd.concat([pd.read_csv(io.StringIO(t), usecols=[x]) for x in cols], axis=1)

Out[121]: 
   A  B  C  D
0  1  2  3  4

Однако я думаю, что проще просто отсортировать его по подпунктам -выбирая столбцы в том порядке, который вы хотите после прочтения в обычном режиме:

df = df[['A','B','C','D']]
0
ответ дан EdChum 17 January 2019 в 13:31
поделиться

Я предполагаю, что вы не спрашиваете, как изменить порядок столбцов в Pandas, но хотели бы изменить его перед чтением, возможно, чтобы уменьшить использование памяти. (Если не видите ответа @ jezrael.)

Лучше всего сделать это с csv перед чтением в Панд. Пример:

import csv

with open('file.csv', 'r') as infile, open('reordered.csv', 'a') as outfile:
    fieldnames = ['A', 'B', 'C', 'D']
    writer = csv.DictWriter(outfile, fieldnames=fieldnames)
    writer.writeheader()
    for row in csv.DictReader(infile):
        writer.writerow(row)

Взято из здесь

С точки зрения времени, самое быстрое это сделать как CSV (я тестировал с очень маленьким CSV-файлом): [117 ]

%%time
df = pd.read_csv('r.csv')[['A', 'B', 'C', 'D']]

CPU times: user 3.53 ms, sys: 1.48 ms, total: 5 ms
Wall time: 3.79 ms

%%time
df=pd.read_csv('r.csv')[df.columns[::-1]]

CPU times: user 4.75 ms, sys: 2.01 ms, total: 6.76 ms
Wall time: 5.13 ms

%%time
cols=list('ABCD')
pd.concat([pd.read_csv('r.csv', usecols=[x]) for x in cols], axis=1)

CPU times: user 8.98 ms, sys: 2.25 ms, total: 11.2 ms
Wall time: 9.88 ms

%%time
df = pd.read_csv('r.csv').sort_index(axis=1)

CPU times: user 4.21 ms, sys: 1.88 ms, total: 6.09 ms
Wall time: 4.65 ms

%%time
with open('r.csv', 'r') as infile, open('reordered.csv', 'a') as outfile:

    fieldnames = ['A', 'B', 'C', 'D']
    writer = csv.DictWriter(outfile, fieldnames=fieldnames)
    writer.writeheader()
    for row in csv.DictReader(infile):
        writer.writerow(row)
df = pd.read_csv('reordered.csv')

CPU times: user 3.29 ms, sys: 1.91 ms, total: 5.2 ms
Wall time: 3.83 ms
0
ответ дан Josh Friedlander 17 January 2019 в 13:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: