Преобразование sav в pandas df пропускает последний столбец - PullRequest
0 голосов
/ 28 июня 2018

Я конвертирую файл SPSS .sav в фрейм данных Pandas, используя следующий код:

import pandas as pd
import savReaderWriter as spss

raw_data = spss.SavReader(filename, returnHeader = True)
raw_data_list = list(raw_data)
df = pd.DataFrame(raw_data_list)

Этот код работает хорошо, за исключением того, что последний столбец не включен в кадр данных.

Я конвертирую огромную (и очень неэффективную) таблицу с 70 484 столбцами и 3 609 строками. Однако только 70 483 столбцов находятся в кадре данных панд, все строки там.

Что здесь не так?

1 Ответ

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

Проверьте вашу первую строку в вашем файле .sav

Если вы хотите прочитать данные как информационный фрейм в Pandas. Файл имеет следующий формат

a b c d
0 1 2 3 4 5
1 2 3 4 5 6

Когда вы читаете его с помощью Pandas, вы получаете следующий фрейм данных

    a b c d
0 1 2 3 4 5
1 2 3 4 5 6

Когда я выполняю print df.columns, я получаю что-то вроде:

Index([u'a', u'b', u'c', u'd'], dtype='object')

И когда я выполняю печать df.iloc[0], я получаю:

a  2
b  3
c  4
d  5

Name: (0, 1)

Полагаю, вы хотели бы иметь такой кадр данных, как этот

a b c d col1 col2
0 1 2 3 4    5
1 2 3 4 5    6

Возможное решение:

Один из способов сделать это - прочитать данные дважды. Один раз с пропуском первой строки (исходных столбцов), а второй - только с прочитанными именами столбцов (и пропущены все строки)

df = pd.read_csv(header=None, skiprows=1)
columns = pd.read_csv(nrows=0).columns.tolist()
columns
Output
['a', 'b', 'c', 'd']

Теперь найдите количество пропущенных столбцов и используйте понимание списка, чтобы создать новые столбцы

num_missing_cols = len(df.columns) - len(columns)
new_cols = ['col' + str(i+1) for i in range(num_missing_cols)]
df.columns = columns + new_cols
df

   a  b  c  d  col1  col2
0  0  1  2  3     4     5
1  1  2  3  4     5     6
...