我有一个名为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
任何人都可以帮忙吗?
答案 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