根据自定义条件在csv中过滤行

时间:2020-08-03 15:13:53

标签: python pandas filter

说我有如下的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 | +-----+-----------+---------+ READYDELIVERED的ID。

  • 相同的ID将多次出现在不同的州和城市。
  • READY NEWYORK始终为空
  • 已交付city始终会有一些值。

所以在这里我首先要检查列city的值是否为DELIVERED city。如果是NEWYORK,则使用该ID的READY行。如果没有state行,那么我们可以忽略(在此示例中为ID 105)

预期输出

READY

我尝试在熊猫中使用自我加入。但由于我是python新手,我不知道如何进一步进行。目前,我正在用SQL执行此操作。

+-----+-----------+---------+
| ID  | state     | city    |
+-----+-----------+---------+
| 101 | READY     |         |
| 103 | READY     |         |
+-----+-----------+---------+

2 个答案:

答案 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