从dataframe列中的列表创建成对嵌套列表,其中第一对的结束元素应为下一对的开始元素

2024-06-09 07:54:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我在geodataframe中有一个数据,如图所示。 enter image description here 它包含一个名为邻里_list的列,其中包含路线的所有邻里代码的列表。我想要的是创建一个嵌套列表,其中第一对的结束元素应该是下一对的开始元素,因为我想要生成一个OD定向网络(用于生成边),顺序在这里也很重要

为了更清楚一点,这里有一些代码

这里是一条来自数据帧的记录,我尝试了一些bodge方法来获得期望的结果

list= [15,30,9,7,8]
new_list=[]
for i in range(len(list)-1):
    new_list.append(list[i])
    new_list.append(list[i+1])

上面的代码给出了一个组合列表,然后我把它分解成我需要的两个对

chunks = [new_list[x:x+2] for x in range(0, len(new_list), 2)]
chunks

实际数据为[15,30,9,7,8] 期望的输出是[[15,30],[30,9],[9,7],[7,8]]

我刚刚从这里的答案中找出了上面的代码 Split a python list into other "sublists" i.e smaller lists

然而现在真正的问题是如何在熊猫身上应用它

到目前为止,我正试图改变这里提到的一些东西 https://chrisalbon.com/python/data_wrangling/pandas_list_comprehension/

这里有一些不完整的代码,我不确定它是否正确,但我想如果我能从邻里列表列的每一行中获得列表项的长度,那么也许我可以完成

for row in df['neighbourhood_list']:
    for i in range ??HOW TO GET range(len) of each row??
    new.append(row[i])
    new.append(row[i+1])

注意:作为外行,我不知道嵌套循环或lambda函数是如何工作的,也不知道是否有任何可用的pandas函数来执行此任务。 我想的另一件事是stackoverflow中也提到过类似的东西,但仍然是如何获得每行列表的长度,即使我尝试先创建一个函数,然后将它应用到我的列中

df[["YourColumns"]].apply(someFunction)

如果问题需要进一步澄清,请提前道歉(如果需要,我可以提供问题的更多细节)

非常感谢


Tags: 数据函数代码in邻里元素列表new
2条回答

我的最佳猜测是,您正在尝试创建一列,其中包含一列列表中的有序对列表。如果是这样的话,像这样的方法应该会奏效:

编辑

根据您的描述,您的“邻居列表”列还不是列表,而是字符串。添加此行以将列项目转换为列表,然后运行pairs apply

df['neighbourhood_list']=df['neighbourhood_list'].apply(lambda row: row.split(','))
df['pairs'] = df['neighbourhood_list'].apply(lambda row: [[row[i],row[i+1]] for i in range(len(row)-1)])

如果我有误解,请让我知道,我会尝试作出相应的调整

从您发布的描述来看,您所要做的似乎只是从有序的节点列表中获取图形边列表。首先,它有助于使用现有的方法将配对简化为一个简单的表达式。在这种情况下,我建议zip

stops = [15,30,9,7,8]
list(zip(stops, stops[1:]))

输出:

[(15, 30), (30, 9), (9, 7), (7, 8)]

注意,我更改了变量名:使用内置类型作为变量名是一个baaaad想法。它会禁用您引用该类型的某些功能


现在,您只需要将其包装在一个简单的列表达式中。在任何PANDAS教程中,您都可以找到有关将df["neighourhood_list"]用作系列表达式的适当说明

相关问题 更多 >