Python 如果变量可以按连续顺序排列,则将其分组
我有一个如下形式的数据集Python 如果变量可以按连续顺序排列,则将其分组,python,pandas,Python,Pandas,我有一个如下形式的数据集 id year 0 A 2000 1 A 2001 2 B 2005 3 B 2006 4 B 2007 5 C 2003 6 C 2004 7 D 2002 8 D 2003 现在,如果两个或多个ID可以按连续顺序排列,则假定它们是聚合ID的一部分。这意味着最终我希望有一个分组,A&D建立一个分组,B&C建立另一个分组: id year match 0 A 2000 1 1 A 2001 1 7
id year
0 A 2000
1 A 2001
2 B 2005
3 B 2006
4 B 2007
5 C 2003
6 C 2004
7 D 2002
8 D 2003
现在,如果两个或多个ID可以按连续顺序排列,则假定它们是聚合ID的一部分。这意味着最终我希望有一个分组,A&D建立一个分组,B&C建立另一个分组:
id year match
0 A 2000 1
1 A 2001 1
7 D 2002 1
8 D 2003 1
5 C 2003 2
6 C 2004 2
2 B 2005 2
3 B 2006 2
4 B 2007 2
编辑:寻址@Dimitris\u ps注释:假设附加行
id year
9 A 2002
将所需结果更改为
id year match
0 A 2000 1
1 A 2001 1
9 A 2002 1
5 C 2003 1
6 C 2004 1
2 B 2005 1
3 B 2006 1
4 B 2007 1
7 D 2002 2
8 D 2003 2
因为现在不再有a&D的连续顺序,而是a、C和B的顺序,D没有匹配项。将您的
id
重新编码为值,然后您可以根据年份和id
进行排序
import pandas as pd
df = pd.DataFrame({'id':['A', 'A', 'B', 'B', 'B', 'C', 'C', 'D', 'D'],
'year':[2000, 2001, 2005, 2006, 2007, 2003, 2004, 2002, 2003]}) # example dataframe
# Create a dict mapping id to values based on the minimum year
custom_dict = {el:i for i, el in enumerate(df.groupby('id')['year'].min().sort_values().index)}
# and the reverse to map back the values to the id
custom_dict_rev = {v:k for k, v in custom_dict.items()}
df['id'] = df['id'].map(custom_dict)
df = df.sort_values(['year', 'id'])
df['id'] = df['id'].map(custom_dict_rev)
df
将您的id
重新编码为值,然后您可以根据year
和id
进行排序
import pandas as pd
df = pd.DataFrame({'id':['A', 'A', 'B', 'B', 'B', 'C', 'C', 'D', 'D'],
'year':[2000, 2001, 2005, 2006, 2007, 2003, 2004, 2002, 2003]}) # example dataframe
# Create a dict mapping id to values based on the minimum year
custom_dict = {el:i for i, el in enumerate(df.groupby('id')['year'].min().sort_values().index)}
# and the reverse to map back the values to the id
custom_dict_rev = {v:k for k, v in custom_dict.items()}
df['id'] = df['id'].map(custom_dict)
df = df.sort_values(['year', 'id'])
df['id'] = df['id'].map(custom_dict_rev)
df
如果您还有一个id为A和year 2002的行,会发生什么情况,最终结果应该是什么?您需要为更多不同的情况提供更多详细信息。没有两个或多个ID可以与另一个ID形成连续顺序的情况。如果另一行ID为a和2002年,a、C和B将组成一个组,D将不匹配如果您还有另一行ID为a和2002年,会发生什么情况,最终结果应该如何?您需要为更多不同的情况提供更多详细信息。在任何情况下,两个或多个ID都不能与另一个ID形成连续的顺序。对于ID为a且年份为2002的另一行,a、C和B将构成一个组,而D将不匹配,而我提供的示例正是如此,如您在原始帖子的评论中所述,在添加id为A和year 2002的另一行时,它不再起作用。您能否在问题中指定当您添加此额外行时,预期的解决方案是什么,如您在原始帖子的评论中所述,添加id为A和year 2002的另一行时,它将不再起作用。您能否在问题中指定在添加这一行时预期的解决方案