首页 > 解决方案 > 如何保持行与组的第一个值(str)?

问题描述

对于以下情况,我很难找到合适的解决方案:Given is the pandas dataframe (sorted by descending date)


ID  Location    Date
1   x           01.03.20
1   x           27.02.20
1   y           22.02.20
1   x           20.02.20
2   p           04.02.20
2   p           01.03.20
2   y           01.02.20
3   z           29.02.20
3   z           27.02.20
3   z           24.02.20
3   z           23.02.20
3   e           21.02.20
3   z           20.02.20

现在我想为每个 ID 只保留最近位置的行(数据类型:字符串)——这意味着最终结果应该如下所示:

ID  Location    Date
1   x           01.03.20
1   x           27.02.20
2   p           04.02.20
2   p           01.03.20
3   z           29.02.20
3   z           27.02.20
3   z           24.02.20
3   z           23.02.20

我正在考虑迭代完整的数据帧(〜500000)行,但更喜欢另一种解决方案。非常感谢任何帮助。

非常感谢朱利安

标签: pythonpandas

解决方案


您基本上想要找到[ID,location]每个最新的集合ID并提取该数据。由于它是按日期排序的,因此更加容易,因为您只需要每个 ID 的第一个位置。就像是:

ind = df.groupby('ID')['Location'].first().reset_index().set_index(['ID','Location']).index

df.set_index(['ID','Location']).loc[ind]


>>
             Date
ID Location          
1  x         01.03.20
   x         27.02.20
2  p         04.02.20
   p         01.03.20
3  z         29.02.20
   z         27.02.20
   z         24.02.20
   z         23.02.20

我觉得有一种不那么复杂的方法可以做到这一点,但我就是看不到它......

编辑:您的问题使我想到了另一个解决方案,使用cumsum:基本上我们使用cumsum每个 ID 来计算不同位置的“计数”。

df['loc2'] = df.Location.shift(1) #this gives previous row's Location
df['is_same'] = df.Location != df.loc2 #this marks True when the next Location is the same.
df['cumsum'] = df.groupby('ID')['is_same'].cumsum()

最后:

df[df['cumsum']==1]
>

    ID Location      Date loc2  is_same  cumsum
0    1        x  01.03.20  NaN     True     1.0
1    1        x  27.02.20    x    False     1.0
4    2        p  04.02.20    x     True     1.0
5    2        p  01.03.20    p    False     1.0
7    3        z  29.02.20    y     True     1.0
8    3        z  27.02.20    z    False     1.0
9    3        z  24.02.20    z    False     1.0
10   3        z  23.02.20    z    False     1.0

这只会根据您的需要给出第一个位置的第一次出现!


推荐阅读