将不同长度的列表嵌套到熊猫数据框中

时间:2019-11-16 05:16:20

标签: python pandas numpy

我有一个输入文件,我从一行一行地读取到一个嵌套列表中。该文件的格式为

int string float
int_1 int_2 ... int_n

每行第二行具有不同数量的整数。我使用

读取文件
sim = []
with open(sim_out, 'r') as sim_file_out:
    for line in sim_file_out:
        sim.append(line.split())

并且每一行都读取为字符串列表。由于这些是备用的,因此一旦它们进入父级列表,就很容易拆分偶数和奇数索引。问题是我需要获取包含整数行的列表,转换为整数并将每个数组存储为一个数组,以便以后可以将这些数组用作索引器。本来我是用

import numpy as np
sim_events = []
for i, j in enumerate(sim):
    sim_events.append(np.array(list(map(int, j))))

这被证明是非常慢的(我遍历了20k到300万行之间的任何地方),并使我的运行时间从不到一秒缩短到了几分钟。我用

来反驳
import pandas as pd
odds = np.arange(1,len(sim),2)
sim = np.array(sim)
sites = sim[odds].tolist()
for ii, jj in enumerate(sites):
    sites[ii] = list(map(eval,jj))
sim_events = pd.DataFrame(sites)

这使执行时间缩短到不到一秒钟,但是给我留下了一个包含大量NaN的数据帧。后来,我遍历了一个相等长度的数组,并将每一行作为可以用作索引的数组,我必须使用

for i in other_array:
    step_sites = sim_events.iloc[i].dropna().values.astype(int)-1

这也是非常耗时的,因为必须在每个步骤中完成。

任何建议如何解决这个问题?我知道我可以从df中获取值并过滤掉NaN,但是当我这样做时,我丢失了不同长度数组的结构,这是必须保留的。

2 个答案:

答案 0 :(得分:0)

sim_events = []
for i, j in enumerate(sim):
    sim_events.append(np.array(list(map(int, j))))

可以简化为

sim_events = []
for j in sim:
    sim_events.append(np.array(j, int))

因为您没有使用i索引,并且np.array可以将字符串转换为整数。

您可以使用simsim[1::2]中提取奇数列表。

此外,我在可视化您获得/想要的数据框时遇到了麻烦。

答案 1 :(得分:0)

让我放慢脚步的是每一步到数组的转换。这就是为什么我最后一次尝试仅附加映射列表的原​​因。对于我的应用程序而言,即使删除映射并仅追加数组也非常慢。但是,因为我剩下的是嵌套的字符串列表,所以我唯一可以转换的方法是循环遍历

for ii, jj in enumerate(sites):
    sites[ii] = list(map(eval,jj))
sim_events = pd.DataFrame(sites)

为我提供以后需要索引的类似数组的质量。但这也给我留下了一个像enter image description here

的数据框

这只是来自具有9万行的df的示例。我不能使用fillna,因为我需要将它们设置为整数,然后冒着干扰其他数据的风险。因此,稍后当我想将这些行用作索引器时,我必须使用类似的

for i in other_array:
    step_sites = sim_events.iloc[i].dropna().values.astype(int)-1

这也很耗时