Фильтровать строки в CSV на основе пользовательского условия - PullRequest
2 голосов
/ 03 августа 2020

Скажем, у меня есть CSV, как показано ниже

+-----+-----------+---------+
| 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 как NEWYORK.

  • Тот же идентификатор будет приходите несколько раз с разными штатами и городами.
  • Всегда city для READY будет пустым
  • Всегда city для DELIVERED будет иметь некоторые значения.

, поэтому сначала я хочу проверить значение столбца city для DELIVERED state. Если это NEWYORK, возьмите строку READY этого идентификатора. Если для этого нет строки READY, мы можем игнорировать (ID 105 в этом примере)

ОЖИДАЕМЫЙ ВЫХОД

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

Я пробовал использовать самостоятельное присоединение к pandas. Но я понятия не имею, как действовать дальше, так как я новичок в python. В настоящее время я делаю это в SQL.

import pandas as pd
mydata = pd.read_csv('C:/Mypython/Newyork',encoding = "ISO-8859-1")
NY = pd.merge(mydata,mydata,left_on='ID',right_on='ID',how='inner')

Ответы [ 2 ]

3 голосов
/ 03 августа 2020

Давайте попробуем 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
2 голосов
/ 03 августа 2020

Используйте условие NEWYORK, чтобы получить список идентификаторов, а затем используйте этот список для фильтрации.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...