在顺序重要时快速填充Pandas DataFrame的方法

2 投票
1 回答
2114 浏览
提问于 2025-04-17 22:53

我正在为从一个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",...](不过从你的例子来看,似乎只有一个索引)。

撰写回答