【问题标题】:Compare round-trip list values and change them Pandas比较往返列表值并更改它们 Pandas
【发布时间】:2021-02-09 20:49:35
【问题描述】:

我有一个 df 数据框。数据框具有名为“源”、“目标”和“路径”的三列。 Path列是一个列表,值是各个路由器的路径。 “Source”表示各个路由器路径的起点,“Destination”表示各个路由器路径的终点:

Source      Destination   Path
---------- ------------ -------------------------------------------------
10.0.13.100 10.0.14.100 ['10.0.1.26']
10.0.14.100 10.0.13.100 ['10.0.1.25']
10.0.13.100 10.0.12.100 ['10.0.1.17', '10.0.1.5', '10.0.1.2']
10.0.12.100 10.0.13.100 ['10.0.1.1', '10.0.1.6', '10.0.1.18']
10.0.13.100 10.0.22.100 ['10.0.1.17', '10.0.1.14', '10.0.4.6', '10.0.2.5']
10.0.22.100 10.0.13.100 ['10.0.2.6', '10.0.4.5', '10.0.1.13', '10.0.1.18']
10.0.11.100 10.0.13.100 ['10.0.1.6', '10.0.1.18']
10.0.13.100 10.0.11.100 ['10.0.1.17', '10.0.1.5']
.....................................................................

我想要创建一个名为“Path_Def”的附加列,其中 Path 列的返回路径是参照 Source 和 Destination 列进行评估的。

示例: 我使用路径 [..] 评估起点 -> 10.0.13.100 和目的地 -> 10.0.14.100 并使用其路径 [..] 评估其反向路径或起点 -> 10.0.14.100 和目的地 -> 10.0.13.100 ...]。 我想做的是通过反转这些值将第二条路径的值更改为第一条路径的值(始终指的是起点和终点)。

所以对于列表中的每个值,你应该这样做:

  Source        Destination   Path
  10.0.13.100   10.0.22.100  ['10.0.1.17', '10.0.1.14', '10.0.4.6', '10.0.2.5']
  10.0.22.100   10.0.13.100  ['10.0.2.5', '10.0.4.6', '10.0.1.14', '10.0.1.17']
.............................................................................

..

我想要的数据框中的结果是这样的:

Source      Destination   Path_Def                                      
10.0.13.100 10.0.14.100  ['10.0.1.26']                                
10.0.14.100 10.0.13.100  ['10.0.1.26']
10.0.13.100 10.0.12.100  ['10.0.1.17', '10.0.1.5', '10.0.1.2']
10.0.12.100 10.0.13.100  ['10.0.1.2', '10.0.1.5', '10.0.1.17']
10.0.13.100 10.0.22.100  ['10.0.1.17', '10.0.1.14', '10.0.4.6', '10.0.2.5']
10.0.22.100 10.0.13.100  ['10.0.2.5', '10.0.4.6', '10.0.1.14', '10.0.1.17']
10.0.11.100 10.0.13.100  ['10.0.1.6', '10.0.1.18']
10.0.13.100 10.0.11.100  ['10.0.1.18', '10.0.1.6']
.....................................................................

如何做到这一点?我真的不知道从哪里开始,非常感谢

编辑 @Simon 代码后:

编辑合并 DF:

编辑在最后一个代码之后:

【问题讨论】:

  • 行排序有保证吗?即10.0.14.100 10.0.13.100总是在10.0.13.100 10.0.14.100之后出现
  • 不,不幸的是它们分散在数据框中,例如 10.0.14.100 10.0.13.100 在数据框的第七行,而不是 10.0.13.100 10.0.14.100 在数据框的第十二行跨度>
  • 所以对于其他人,假设在这种情况下,我将它们放在一起,以便更好地理解我想要实现的目标

标签: python python-3.x pandas dataframe swap


【解决方案1】:

将数据框合并到自身,然后应用条件并最终清理列:

import pandas as pd

# setup
source = ["10.0.14.100", "10.0.13.100", "10.0.12.100", "10.0.13.100", "10.0.22.100", "10.0.11.100", "10.0.13.100", "10.0.13.100"]
destination = ["10.0.13.100", "10.0.12.100", "10.0.13.100", "10.0.22.100", "10.0.13.100", "10.0.13.100", "10.0.11.100", "10.0.14.100"]
path = [['10.0.1.25'], ['10.0.1.17', '10.0.1.5', '10.0.1.2'], 
        ['10.0.1.1', '10.0.1.6', '10.0.1.18'], ['10.0.1.17', '10.0.1.14', '10.0.4.6', '10.0.2.5'], 
        ['10.0.2.6', '10.0.4.5', '10.0.1.13', '10.0.1.18'], ['10.0.1.6', '10.0.1.18'], ['10.0.1.17', '10.0.1.5'], ['10.0.1.26']]

df = pd.DataFrame({"source":source, "destination":destination, "path":path})

# join column onto itself
df = df.merge(df, left_on=["destination", "source"], right_on=["source", "destination"])
# Conditionally choose the right path
df["Path_Def"] = np.where(df["source_x"] < df["destination_x"], df["path_x"], df["path_y"])
# Flip the ones that need to be flipped
df["Path_Def"] = [path[::-1] if source > destination else path for path, source, destination in zip(df["Path_Def"].values, df["source_x"].values, df["destination_x"].values)]


# select columns you want to keep
df = df[["source_x", "destination_x", "Path_Def"]]
print(df)

输出:

      source_x destination_x                                    Path_Def
0  10.0.14.100   10.0.13.100                                 [10.0.1.26]
1  10.0.13.100   10.0.12.100             [10.0.1.18, 10.0.1.6, 10.0.1.1]
2  10.0.12.100   10.0.13.100             [10.0.1.1, 10.0.1.6, 10.0.1.18]
3  10.0.13.100   10.0.22.100  [10.0.1.17, 10.0.1.14, 10.0.4.6, 10.0.2.5]
4  10.0.22.100   10.0.13.100  [10.0.2.5, 10.0.4.6, 10.0.1.14, 10.0.1.17]
5  10.0.11.100   10.0.13.100                       [10.0.1.6, 10.0.1.18]
6  10.0.13.100   10.0.11.100                       [10.0.1.18, 10.0.1.6]
7  10.0.13.100   10.0.14.100                                 [10.0.1.26]

【讨论】:

  • Simon 我已经以 excel 格式插入了发生在我身上的事情的图像...
  • 无论如何,非常感谢您的帮助
  • @LucaLazzati 我不认为条件错误,也许是合并。你能展示合并后数据框的样子吗?
  • 完成,结束
  • 不过很奇怪,会不会是路由上的引号“”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 2016-08-29
  • 2022-02-08
  • 1970-01-01
相关资源
最近更新 更多