说我有如下的csv
new
现在,我要获得状态+-----+-----------+---------+
| ID | state | city |
+-----+-----------+---------+
| 101 | READY | |
| 101 | DELIVERED | NEWYORK |
| 101 | DELIVERED | LONDON |
| 102 | READY | |
| 102 | DELIVERED | LONDON |
| 103 | READY | |
| 103 | DELIVERED | NEWYORK |
| 104 | READY | |
| 104 | DELIVERED | TOKYO |
| 104 | DELIVERED | PARIS |
| 105 | DELIVERED | NEWYORK |
+-----+-----------+---------+
为READY
为DELIVERED
的ID。
NEWYORK
始终为空city
始终会有一些值。所以在这里我首先要检查列city
的值是否为DELIVERED city
。如果是NEWYORK,则使用该ID的READY行。如果没有state
行,那么我们可以忽略(在此示例中为ID 105)
预期输出
READY
我尝试在熊猫中使用自我加入。但由于我是python新手,我不知道如何进一步进行。目前,我正在用SQL执行此操作。
+-----+-----------+---------+
| ID | state | city |
+-----+-----------+---------+
| 101 | READY | |
| 103 | READY | |
+-----+-----------+---------+
答案 0 :(得分:3)
让我们尝试groupby().transform()
来识别具有NEWYORK
的对象,然后进行布尔索引:
has_NY = df['city'].eq('NEWYORK').groupby(df['ID']).transform('any')
mask = df['state'].eq('READY') & has_NY
df[mask]
输出:
ID state city
0 101 READY None
5 103 READY None
答案 1 :(得分:2)
使用NEWYORK
条件获取ID列表,然后使用该列表进行过滤。
new_york_ids = df.loc[df['city']=='NEWYORK', 'ID']
df[(df['state']=='READY') & (df['ID'].isin(new_york_ids))]
ID state city
0 101 READY None
5 103 READY None