如何筛选同一日期下含不同城市记录的ID对应的DataFrame数据?
问题:筛选同一日期下存在多城市记录的ID对应数据子集
示例输入DataFrame
| ID | DATE | CITY |
|---|---|---|
| ABC | 2022-07-08 | AAA |
| ABC | 2022-07-22 | BBB |
| XYZ | 2022-07-09 | CCC |
| XYZ | 2022-07-09 | YYY |
| PQR | 2022-09-22 | FFF |
| PQR | 2022-09-26 | EEE |
| EFG | 2022-10-03 | AAA |
| EFG | 2022-10-16 | KKK |
| EFG | 2022-10-16 | PPP |
| EFG | 2022-10-16 | QQQ |
期望输出
| ID | DATE | CITY |
|---|---|---|
| XYZ | 2022-07-09 | CCC |
| XYZ | 2022-07-09 | YYY |
| EFG | 2022-10-16 | KKK |
| EFG | 2022-10-16 | PPP |
| EFG | 2022-10-16 | QQQ |
解决方案(Pandas实现)
方法1:使用groupby + filter
直接按ID和DATE分组,筛选出每组内CITY唯一值数量大于1的分组数据:
import pandas as pd # 构造示例数据 data = { 'ID': ['ABC', 'ABC', 'XYZ', 'XYZ', 'PQR', 'PQR', 'EFG', 'EFG', 'EFG', 'EFG'], 'DATE': ['2022-07-08', '2022-07-22', '2022-07-09', '2022-07-09', '2022-09-22', '2022-09-26', '2022-10-03', '2022-10-16', '2022-10-16', '2022-10-16'], 'CITY': ['AAA', 'BBB', 'CCC', 'YYY', 'FFF', 'EEE', 'AAA', 'KKK', 'PPP', 'QQQ'] } df = pd.DataFrame(data) # 筛选目标数据 result = df.groupby(['ID', 'DATE']).filter(lambda x: x['CITY'].nunique() > 1) print(result)
方法2:先标记有效分组再合并
先计算每个(ID, DATE)组合的城市唯一值数量,再筛选出符合条件的组合,最后和原数据合并:
import pandas as pd # 构造示例数据 data = { 'ID': ['ABC', 'ABC', 'XYZ', 'XYZ', 'PQR', 'PQR', 'EFG', 'EFG', 'EFG', 'EFG'], 'DATE': ['2022-07-08', '2022-07-22', '2022-07-09', '2022-07-09', '2022-09-22', '2022-09-26', '2022-10-03', '2022-10-16', '2022-10-16', '2022-10-16'], 'CITY': ['AAA', 'BBB', 'CCC', 'YYY', 'FFF', 'EEE', 'AAA', 'KKK', 'PPP', 'QQQ'] } df = pd.DataFrame(data) # 计算每个分组的城市唯一值数量 city_counts = df.groupby(['ID', 'DATE'])['CITY'].nunique().reset_index(name='city_count') # 获取符合条件的(ID, DATE)组合 valid_groups = city_counts[city_counts['city_count'] > 1][['ID', 'DATE']] # 合并得到结果 result = pd.merge(df, valid_groups, on=['ID', 'DATE']) print(result)
两种方法都能输出符合要求的结果。
内容的提问来源于stack exchange,提问作者perumadan
相关产品推荐
相关产品推荐

