python - 如何保持行与组的第一个值(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)行,但更喜欢另一种解决方案。非常感谢任何帮助。
非常感谢朱利安
解决方案
您基本上想要找到[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
这只会根据您的需要给出第一个位置的第一次出现!
推荐阅读
- git - 对master应用hotfix是否与神器中的神器提升实践相矛盾?
- sql - 连接两个事实表(F4801 和 F4111)
- php - 表单提交时模态关闭的纠正建议
- regex - SED - 需要简单的正则表达式
- python - 阶乘矩和下降阶乘
- javascript - ul 列表中的第一个和最后一个 VISIBLE 元素
- javascript - 为什么这个 document.getElementById().value() 在我的 php 中不起作用?
- python - Python3:如何获得用户的重复响应并再次运行循环
- android - 像 ImageView scaleType="fitCenter" 一样缩放背景
- selenium - 如何在 Selenium 中创建具有较大 id 和类名属性值的自定义定位器