2016-07-11 4 views
2

У меня есть dataframe называется Mix:Состояния в панде dataframe

 Name Surname Date Status 
0  A  A8  1902 aab 
1  B  B9  1976 ab 
2  C  C8  1901 aab 
3  D  D4  1986 abc 
4  E  E7  1986 abb 
5  F  F1  1986 ab 
6  G  G5  1987 abc 
7  H  H2  1998 acc 

Мне нужно создать новый dataframe в соответствии с несколькими условиями: 1) принять все дубликаты из колонки Status и получить это:

  Name Surname Date Status 
    0  A  A8  1902 aab 
    1  B  B9  1976 ab 
    2  C  C8  1901 aab 
    3  D  D4  1986 abc 
    5  F  F1  1986 ab 
    6  G  G5  1987 abc 

2) Возьмите только те строки одного и того же статуса, чьи даты отличается друг от друга более или менее чем 1, и получить это:

  Name Surname Date Status 
    0  A  A8  1902 aab 
    2  C  C8  1901 aab 
    3  D  D4  1986 abc 
    6  G  G5  1987 abc 

Может ли кто-нибудь помочь?

+1

Вы можете показать, что вы пробовали, например, для 1) взглянуть на 'duplicated', для 2) посмотреть на' groupby' – EdChum

+0

yep я сделал оба, но dublicated дал мне только список значений, которые дублируются , а не фрейм данных, как мне нужно. Particulary, я попробовал Mix.set_index ('Status) .index.get_duplicates() – Polly

+1

Вам нужно использовать список значений, которые дублируются, чтобы фильтровать df, можете ли вы пойти, и если вы все еще застряли, возвращайтесь с помощью попытки. SO не является службой написания кода, если мы просто дадим вам ответ, это не обязательно поможет вам научиться решать подобные проблемы позже IMO – EdChum

ответ

2

Вы можете использовать результат duplicated для фильтрации основного ДФА с помощью isin:

In [38]: 
duplicated = df[df['Status'].isin(df.loc[df['Status'].duplicated(), 'Status'])] 
duplicated 

Out[38]: 
    Name Surname Date Status 
0 A  A8 1902 aab 
1 B  B9 1976  ab 
2 C  C8 1901 aab 
3 D  D4 1986 abc 
5 F  F1 1986  ab 
6 G  G5 1987 abc 

Затем вы хотите groupby на колонке Состояния и вызвать diff на колонке «Дата» и фильтре, сравнивая ли разница в том, < = 1:

In [44]: 
duplicated[duplicated.groupby('Status')['Date'].diff() <= 1] 

Out[44]: 
    Name Surname Date Status 
2 C  C8 1901 aab 
6 G  G5 1987 abc 

вы можете получить список идентификаторов «Статус», которые отвечают этим критериям и фильтр:

In [45]: 
final_statuses = duplicated[duplicated.groupby('Status')['Date'].diff() <= 1]['Status'] 
final_statuses 

Out[45]: 
2 aab 
6 abc 
Name: Status, dtype: object 

In [46]: 
duplicated.loc[duplicated['Status'].isin(final_statuses)] 

Out[46]: 
    Name Surname Date Status 
0 A  A8 1902 aab 
2 C  C8 1901 aab 
3 D  D4 1986 abc 
6 G  G5 1987 abc 
+0

Eeee, большое спасибо! :) – Polly

Смежные вопросы