在顺序重要时快速填充Pandas DataFrame的方法
我正在为从一个API获取大量数据编写一些基础支持代码。结果会以字典的形式返回,每个索引值对应一个字典,也就是说:
[(index0, {col3:val3, col0:val0, col12:val12, ...}), (index1,{...}), ...]
不过,虽然索引是按顺序排列的,但列的顺序却不一定。并且,并不是所有的索引都有所有的列。
确保列的顺序正确是很重要的,比如说 col_list = [col0, col1, ...]
,索引的顺序也要正确 index_list = [index0, index1, ...]
。
我倾向于先定义好数据框架
df = DataFrame(index=index_list, columns=col_list)
然后通过 df.loc[idx, col] = val
来给数据赋值,这样做可能是最快的方法,特别是当数据比较稀疏的时候。不过,这里的数据几乎肯定是比较密集的。
有没有其他的构造方法可以显著提高速度呢?
1 个回答
0
一个想法是先把数据批量加载进来,然后再根据索引列进行排序。Pandas这个库特别适合处理这种情况。
首先,你需要把你的元组和字典的列表调整成字典的列表(这样你才能方便地初始化数据框)。有一种简单的方法可以做到这一点(假设你在之前的解析中无法控制格式,格式和你的例子一样):
your_data = [(2,{"col1":2,"col2":3}),(-1,{"col3":22,"col1":4})]
dict = [x[1].update({"idx_col":x[0]}) or x[1] for x in your_data]
dict>> [{'col1': 2, 'col2': 3, 'idx_col': 2}, {'col1': 4, 'col3': 22, 'idx_col': -1}]
然后:
df = pd.DataFrame(columns=["col1","col2","col3"]) #not necessary if every col appears
#at least once in the data
df = df.append([{"idx_col":2,"col1":2,"col2":3},{"idx_col":-1,"col3":22,"col1":4}])
#column order preserved
df = df.set_index("idx_col",drop=True).sort() #index order preserved now
得到的df(数据框):
col1 col2 col3
idx_col
-1 4 NaN 22
2 2 3 NaN
如果你有多个索引列,只需在set_index方法中使用一个数组["idx0","idx1",...](不过从你的例子来看,似乎只有一个索引)。