Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果变量可以按连续顺序排列,则将其分组_Python_Pandas - Fatal编程技术网

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的另一行时,它将不再起作用。您能否在问题中指定在添加这一行时预期的解决方案