使用 concat 和 split 计算数据帧的有效方法

efficient way of computing a dataframe using concat and split

我是 python/pandas/numpy 的新手,我需要创建以下数据框:

DF  = pd.concat([pd.Series(x[2]).apply(lambda r: pd.Series(re.split('\@|/',r))).assign(id=x[0]) for x in hDF])

其中 hDF 是由以下人员创建的数据框:

hDF=pd.DataFrame(h.DF)

h.DF 是一个列表,其元素如下所示:

    ['5203906',
 ['highway=primary',
  'maxspeed=30',
  'oneway=yes',
  'ref=N 22',
  'surface=asphalt'],
 ['3655224911@1.735928/42.543651',
  '3655224917@1.735766/42.543561',
  '3655224916@1.735694/42.543523',
  '3655224915@1.735597/42.543474',
  '4817024439@1.735581/42.543469']]

但是,在某些情况下,列表很长 (O(10^7)),而且 h.DF[*][2] 中的列表也很长,所以我 运行 内存不足。

我可以获得相同的结果,避免使用 lambda 函数,如下所示:

DF  = pd.concat([pd.Series(x[2]).str.split('\@|/', expand=True).assign(id=x[0]) for x in hDF])

但在列表很长的情况下,我仍然运行内存不足。

你能想出一种可能的解决方案来获得相同的结果而不耗尽资源吗?

我设法使用以下代码使其工作:

bl = []
for x in h.DF:
    data = np.loadtxt(
        np.loadtxt(x[2], dtype=str, delimiter="@")[:, 1], dtype=float, delimiter="/"
    ).tolist()
    [i.append(x[0]) for i in data]
    bl.append(data)
bbl = list(itertools.chain.from_iterable(bl))
DF = pd.DataFrame(bbl).rename(columns={0: "lon", 1: "lat", 2: "wayid"})

现在超级快:)