Как извлечь данные для условия двух столбцов в pandas - PullRequest
0 голосов
/ 21 апреля 2020
   dept_ID Year_join  salary  present
1     ID1     2000   10000   0 
2     ID1     2001   10000   0
3     ID1     2002   10000   0
4     ID1     2003   10000   0
5     ID1     2004   10000   1
6     ID2     2000   20000   0
7     ID2     2001   20000   1
8     ID2     2002   20000   0
9     ID3     2000   15000   1
10    ID1     2000   10000   0
11    ID1     2001   10000   0
12    ID1     2002   10000   0
13    ID1     2003   10000   0
14    ID1     2004   10000   0
15    ID2     2000   20000   1
16    ID2     2001   20000   0
17    ID2     2002   20000   0
18    ID3     2000   15000   0 
19    ID1     2000   10000   1
20    ID1     2001   10000   0

Я хочу извлечь данные всех идентификаторов отделов, которые хотя бы один раз равны 1, а также, если мне нужно 500 уникальных данных dept_id. Я пробовал приведенный ниже код, но не получил желаемый вывод.

dept_sub=df.dropna(subset=['dept_ID'])
df_1 = dept_sub[dept_sub['present'].isin(['1'])].copy()
s = df.groupby('dept_ID')['present'].nunique()
department = s.index[s.eq(1)].unique()
final_data = dept_sub[dept_sub['dept_ID'].isin(department)]

Это желаемый вывод

  dept_ID Year_join  salary  present
1     ID1     2000   10000   0 
2     ID1     2001   10000   0
3     ID1     2002   10000   0
4     ID1     2003   10000   0
5     ID1     2004   10000   1
6     ID2     2000   20000   0
7     ID2     2001   20000   1
8     ID2     2002   20000   0
9     ID3     2000   15000   1
10    ID1     2000   10000   0
11    ID1     2001   10000   0
12    ID1     2002   10000   0
13    ID1     2003   10000   0
14    ID1     2004   10000   0
16    ID2     2001   20000   0
17    ID2     2002   20000   0
18    ID3     2000   15000   0 
20    ID1     2001   10000   0

Это пример данных из 20 строк. На самом деле моя форма набора данных (500000,50). Я хочу извлечь данные из всех 500 dept_id, содержащих хотя бы одно текущее значение == 1 и текущее значение покоя == 0 для этого dept_ID

1 Ответ

0 голосов
/ 21 апреля 2020

Если значения в present являются целыми числами, фильтруйте строки с Series.eq в boolean indexing, получите только первые значения по DataFrame.duplicated и добавьте все False для маски такой же длины, как у оригинала, поэтому можно отфильтровать их по обратной маске ~:

mask = (df[df['present'].eq(1)]
             .duplicated(subset=['dept_ID'])
             .reindex(df.index, fill_value=False))

Если значения в present являются строками:

mask = (df[df['present'].eq('1')]
             .duplicated(subset=['dept_ID'])
             .reindex(df.index, fill_value=False))

df = df[~mask]
print (df)
   dept_ID  Year_join  salary  present
1      ID1       2000   10000        0
2      ID1       2001   10000        0
3      ID1       2002   10000        0
4      ID1       2003   10000        0
5      ID1       2004   10000        1
6      ID2       2000   20000        0
7      ID2       2001   20000        1
8      ID2       2002   20000        0
9      ID3       2000   15000        1
10     ID1       2000   10000        0
11     ID1       2001   10000        0
12     ID1       2002   10000        0
13     ID1       2003   10000        0
14     ID1       2004   10000        0
16     ID2       2001   20000        0
17     ID2       2002   20000        0
18     ID3       2000   15000        0
20     ID1       2001   10000        0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...