我正在使用以下代码将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列,所有行都在那里。
这是怎么回事?
答案 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