构造每个源记录的列表

时间:2018-05-02 21:14:22

标签: python list pandas csv

我这里有一个包含两列的csv表:" Source_Polygon_ID"和" Neighbor_Polygon_ID"。我想制作一个包含一系列" Neighbor_Polygon_ID"的列表。只要列表中的项目共享" Source_Polygon_ID"。

以下是csv表的示例: csv table with two columns

以下是我想获得的示例结果: sample of processed result in csv format

我已经使用pandas来读取csv表并使用groupby函数来排序" Neighbor_Polygon_ID"通过他们共同的" Source_Polygon_ID"。但是,这并没有帮助我构建" Neighbor_Polygon_ID"对于每个" Source_Polygon_ID"。有解决方案吗

1 个答案:

答案 0 :(得分:0)

这是一个小代码片段,只使用标准的python库来执行您想要的操作。我假设邻居关系是对称的,因此如果A是B的邻居,那么B也是A的邻居(如果不是这种情况那么只需删除第一个for循环中的第二行)。

我使用Option Explicit Public Sub TransferData() Const OLD_COL1 = "BC" Const OLD_COL2 = "BK" Const NEW_COL1 = "A" Dim oldWb As Workbook, oldWs As Worksheet, oldLR As Long Dim newWb As Workbook, newWs As Worksheet, newLR As Long On Error Resume Next 'Expected errors: new file not found, new sheet name not found Set oldWb = ThisWorkbook Set oldWs = ActiveSheet 'Or: Set oldWs = oldWb.Worksheets("Sheet2") oldLR = oldWs.Cells(oldWs.Rows.Count, OLD_COL1).End(xlUp).Row Application.ScreenUpdating = False Set newWb = Workbooks.Open(Filename:="PATH.xlsx") Set newWs = newWb.Worksheets("NewProjects") If Not newWs Is Nothing Then newLR = newWs.Cells(oldWs.Rows.Count, NEW_COL1).End(xlUp).Row With oldWs.Range(oldWs.Cells(2, OLD_COL2), oldWs.Cells(oldLR, OLD_COL2)) .AutoFilter Field:=1, Criteria1:="<>" If .SpecialCells(xlCellTypeVisible).Cells.Count > 2 Then oldWs.Range(oldWs.Cells(3, OLD_COL1), oldWs.Cells(oldLR, OLD_COL2)).Copy newWs.Cells(newLR + 1, NEW_COL1).PasteSpecial Application.CutCopyMode = False newWs.Sort.SortFields.Clear newWb.Close SaveChanges:=True Else newWb.Close SaveChanges:=False End If .AutoFilter End With End If Application.ScreenUpdating = True End Sub ,什么是普通python字典的子类,其行为与它完全相同,除非您尝试访问不在字典中的键。在这种情况下,它将此键的值实例化为默认值,您可以在创建字典时设置该值。在这种情况下,它是一个空集。这就是为什么访问defaultdict永远不会抛出neighbours[row['source']]

其余的代码非常简单我只是读取输入文件,并为每个id构建一组相邻的id。然后,我将这些写入输出文件。

KeyError