pandas数据帧中的条件

时间:2016-07-11 13:52:39

标签: python pandas dataframe

我有一个名为Mix的数据框:

     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

我需要根据以下几个条件创建一个新的数据帧: 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 个答案:

答案 0 :(得分:2)

您可以使用duplicated的结果使用isin过滤主df:

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

然后,您可以获取符合此条件并过滤的“状态”ID列表:

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