gpt4 book ai didi

python - 使用 for 循环将一行 (pandas) 与下一行进行比较,如果不相同,则从列中获取一个值

转载 作者:行者123 更新时间:2023-12-04 03:33:23 24 4
gpt4 key购买 nike

我有这个 Pandas 数据框:

         full path                               name      time 
0 C:\Users\User\Desktop\Test1\1.txt 1.txt 10:20
1 C:\Users\User\Desktop\Test1\1.txt 1.txt 10:25
2 C:\Users\User\Desktop\Test1\Test2\1.txt 1.txt 10:30
3 C:\Users\User\Desktop\Test1\1.txt 1.txt 10:40
4 C:\Users\User\Desktop\Test1\2.txt 2.txt 10:50
5 C:\Users\User\Desktop\Test1\Test2\1.txt 2.txt 10:60

我想比较具有相同名称和相同路径的所有行,如果路径发生变化,则获取时间和文件夹移动到。例如,第一行与第二行相比,“名称”和“完整路径”没有变化,因此它应该通过。然后第二行比较第三行,名称相同但路径已更改,所以我需要获取时间例如第三行“10:30 和文件夹(Test2)”的时间并将其放入新的专栏。

期望的输出是:

         full path                               name      time    time_when_path_changed
0 C:\Users\User\Desktop\Test1\1.txt 1.txt 10:20
1 C:\Users\User\Desktop\Test1\1.txt 1.txt 10:25
2 C:\Users\User\Desktop\Test1\Test2\1.txt 1.txt 10:30 10:30 - Test2
3 C:\Users\User\Desktop\Test1\1.txt 1.txt 10:40 10:40 - Test1
4 C:\Users\User\Desktop\Test1\2.txt 2.txt 10:50
5 C:\Users\User\Desktop\Test1\Test2\1.txt 2.txt 10:60 10:60 - Test2

编辑:

是的,@erfan 它完美地解决了我描述的问题,但我按 1 1 1 的顺序写了名字,但是当我有一个如下所示的数据框时,它不起作用。我还对所需的输出进行了修改。你也有解决方案吗?

提前致谢。

         full path                               name      time 
0 C:\Users\User\Desktop\Test1\1.txt 1.txt 10:20
1 C:\Users\User\Desktop\Test1\1.txt 1.txt 10:25
2 C:\Users\User\Desktop\Test1\2.txt 2.txt 10:50
2 C:\Users\User\Desktop\Test1\Test2\1.txt 1.txt 10:30
3 C:\Users\User\Desktop\Test1\1.txt 1.txt 10:40
5 C:\Users\User\Desktop\Test1\Test2\2.txt 2.txt 10:60

期望的输出:

         full path                               name      time    moved to "Test2"   moved to "Test1"
0 C:\Users\User\Desktop\Test1\1.txt 1.txt 10:20
1 C:\Users\User\Desktop\Test1\1.txt 1.txt 10:25
2 C:\Users\User\Desktop\Test1\2.txt 2.txt 10:50
3 C:\Users\User\Desktop\Test1\Test2\1.txt 1.txt 10:30 10:30
5 C:\Users\User\Desktop\Test1\1.txt 1.txt 10:40 10:40
5 C:\Users\User\Desktop\Test1\Test2\2.txt 2.txt 10:60 10:60

最佳答案

我们可以使用以下逻辑:

  1. 如果完整路径不等于之前的行
  2. name 等于前一行(同组)
  3. 如果第 1 点和第 2 点为真,我们得到时间 + 最深路径
m1 = df["full path"].ne(df["full path"].shift(1, fill_value=df["full path"].iloc[0]))
m2 = df["name"].eq(df["name"].shift(fill_value=df["name"].iloc[0]))

folder = df["full path"].str.rsplit("\\", 2).str[-2]

df["time_when_path_changed"] = np.where(m1 & m2, df["time"] + " - " + folder, "")
                                 full path   name   time  \
0 C:\Users\User\Desktop\Test1\1.txt 1.txt 10:20
1 C:\Users\User\Desktop\Test1\1.txt 1.txt 10:25
2 C:\Users\User\Desktop\Test1\Test2\1.txt 1.txt 10:30
3 C:\Users\User\Desktop\Test1\1.txt 1.txt 10:40
4 C:\Users\User\Desktop\Test1\2.txt 2.txt 10:50
5 C:\Users\User\Desktop\Test1\Test2\1.txt 2.txt 10:60

time_when_path_changed
0
1
2 10:30 - Test2
3 10:40 - Test1
4
5 10:60 - Test2

关于python - 使用 for 循环将一行 (pandas) 与下一行进行比较,如果不相同,则从列中获取一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67446900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com