使用 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"})
现在超级快:)
我是 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"})
现在超级快:)