将sav转换为pandas df错过了最后一列

时间:2018-06-28 11:05:54

标签: python pandas spss

我正在使用以下代码将SPSS .sav文件转换为熊猫数据帧:

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)

此代码效果很好,除了数据框中不包含最后一列。

我正在转换一个巨大的(并且效率很低)表,该表具有70484列和3609行。但是,pandas数据框中只有70,483列,所有行都在那里。

这是怎么回事?

1 个答案:

答案 0 :(得分:2)

  

检查.sav文件中的第一行

如果要将数据作为数据帧读取到Pandas中。 该文件具有以下格式

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

用熊猫阅读时,会得到以下数据框

    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