python - 如何根据条件从数据框中删除行
问题描述
我有以下带有(“ID”,“月份”和“状态”)的数据框。状态是关于“流失”= 1 和“不流失”= 2。我想删除除第一次出现外已经流失的 ID 的所有行。例如:
数据框
ID Month Status
2310 201708 2
2310 201709 2
2310 201710 1
2310 201711 1
2310 201712 1
2310 201801 1
2311 201704 2
2311 201705 2
2311 201706 2
2311 201707 2
2311 201708 2
2311 201709 2
2311 201710 1
2311 201711 1
2311 201712 1
2312 201708 2
2312 201709 2
2312 201710 2
2312 201711 1
2312 201712 1
2312 201801 1
删除后我应该有以下数据框
ID Month Status
2310 201708 2
2310 201709 2
2310 201710 1
2311 201704 2
2311 201705 2
2311 201706 2
2311 201707 2
2311 201708 2
2311 201709 2
2311 201710 1
2312 201708 2
2312 201709 2
2312 201710 2
2312 201711 1
我尝试了以下方法 - 首先找到每个客户 ID 和状态 = 1 的最小日期
df1=df[df.Status==1].groupby('ID')['Month'].min()
然后我必须删除状态 1 大于 MOnth 最小值的每个 ID 的所有行。
解决方案
如果您熟悉DataFrame.idxmin
获取最近一个月的元素索引,您可以尝试:
# find minimum months
min_df = df.groupby(['ID','Status'])['Month'].idxmin().reset_index(drop=True)
# find indices of status 2 rows
df2 = df[df['Status'].eq(2)].index.to_series()
# append indices together
idx_df = min_df.append(df2).drop_duplicates()
# filter indices
df_new = df.iloc[idx_df].sort_index()
print(df_new)
ID Month Status
0 2310 201708 2
1 2310 201709 2
2 2310 201710 1
6 2311 201704 2
7 2311 201705 2
8 2311 201706 2
9 2311 201707 2
10 2311 201708 2
11 2311 201709 2
12 2311 201710 1
15 2312 201708 2
16 2312 201709 2
17 2312 201710 2
18 2312 201711 1
更新
或者,您可能会考虑使用GroupBy.apply
:
df1 = df.groupby(['ID','Status']).apply(lambda x: (x['Status'].eq(2)) | (x['Month'].eq(x['Month'].min())))
df1 = df1.reset_index(level=['ID','Status'], drop=True)
df_new = df.loc[df1]
print(df_new)
ID Month Status
0 2310 201708 2
1 2310 201709 2
2 2310 201710 1
6 2311 201704 2
7 2311 201705 2
8 2311 201706 2
9 2311 201707 2
10 2311 201708 2
11 2311 201709 2
12 2311 201710 1
15 2312 201708 2
16 2312 201709 2
17 2312 201710 2
18 2312 201711 1
更新 2
但是,如果您只是想删除最早月份行之后的所有状态 1 行,那么您可以简单地sort_values
和transform
:
df = df.sort_values(by=['ID','Month']).reset_index(drop=True)
df = df[df.groupby('ID')['Status'].transform(lambda x: ~(x.duplicated() & (x == 1)))]
print(df)
ID Month Status
0 2310 201708 2
1 2310 201709 2
2 2310 201710 1
6 2311 201704 2
7 2311 201705 2
8 2311 201706 2
9 2311 201707 2
10 2311 201708 2
11 2311 201709 2
12 2311 201710 1
15 2312 201708 2
16 2312 201709 2
17 2312 201710 2
18 2312 201711 1
推荐阅读
- haskell - Haskell 中是否有“of”语法?
- javascript - node.js 给定 98000 个域名的列表,如何检查域名是否来自 shopify?
- flask - 来自 evdev 事件的烧瓶页面导航
- c# - 如何在 C# .NET 中读取 HDF5 可变长度字符串属性
- c# - 在asp.net C#中发送HTTP标头后无法重定向异常
- angular - 在 Ionic 和 Angular 应用程序之间共享代码
- typo3 - “错误”类中属性“消息”的注释不正确
- actionscript-3 - 使用 as3 保存游戏内货币
- javascript - 如何使用 nodejs(加密)生成 32 字节的 SHA256 哈希,以避免从 tweetnacl.js 引发错误的密钥大小错误?
- javascript - 如何从 react-router-dom 中的多个参数中获取单个参数?