Pandas:插入缺失的行数据并在组内使用条件进行迭代

Jim*_*mix 7 loops if-statement group-by dataframe pandas

我有一个数据框,需要插入缺失的行数据。这是数据框:

df = pd.DataFrame({
    'name': ['Jim', 'Jim', 'Jim', 'Jim', 'Mike', 'Mike', 'Mike', 'Mike', 'Mike',
           'Polo', 'Polo', 'Polo', 'Polo', 'Tom', 'Tom', 'Tom', 'Tom'],
    'From_num': [80, 68, 751, 'Started', 32, 68, 126, 49, 'Started', 105, 68, 76, 'Started', 251, 49, 23, "Started"],
    'To_num':[99, 80, 68, 751, 105, 32, 68, 126, 49, 324, 105, 114, 76, 96, 115, 49, 23],
})
    name From_num  To_num
0    Jim       80      99
1    Jim       68      80
2    Jim      751      68
3    Jim  Started     751
4   Mike       32     105
5   Mike       68      32
6   Mike      126      68
7   Mike       49     126
8   Mike  Started      49
9   Polo      105     324
10  Polo       68     105
11  Polo       76     114 #Missing record between line 10 and 11
12  Polo  Started      76
13   Tom      251      96
14   Tom       49     115 # Missing record between 13 and 14
15   Tom       23      49
16   Tom  Started      23
Run Code Online (Sandbox Code Playgroud)

每个组(人名)的数据记录在每行'From_num'到'To_num'连续,从下到上对齐,例如Jim:'Started'-> 751, 751->68, 68-> 80、80->99;迈克的模式相同。但是 Polo ad Tom 有一些缺失的数据,例如我希望在第 10 行和第 11 行之间插入一行:114 -> 105 以使整个记录连续。和 Tom 一样,在 13 和 14 之间插入一行:115 -> 251。我尝试使用循环条件编码但失败了,所以如果您有任何想法,请帮助。请不要直接插入那些丢失的记录,因为这是一个简单的例子。非常感谢您的帮助!希望问题很清楚。预期结果如下:

df_expected:
    name From_num  To_num
0    Jim       80      99
1    Jim       68      80
2    Jim      751      68
3    Jim  Started     751
4   Mike       32     105
5   Mike       68      32
6   Mike      126      68
7   Mike       49     126
8   Mike  Started      49
9   Polo      105     324
10  Polo       68     105
11  Polo      114      68 # New Inserted line
12  Polo       76     114
13  Polo  Started      76
14   Tom      251      96
15   Tom      115     251 # New Inserted line
16   Tom       49     115
17   Tom       23      49
18   Tom  Started      23
Run Code Online (Sandbox Code Playgroud)

WeN*_*Ben 4

我们可以提出这个,这里的想法是使用shift获取匹配行并将不匹配行添加到原始 df

s=df.groupby('name',sort=False).From_num.shift()
addingdata=pd.concat([s,df.drop('From_num',1)],axis=1)[df.To_num.ne(s)&s.notnull()]
addingdata.index-=1 
addingdata.columns=['To_num','name', 'From_num']
df=df.append(addingdata).sort_index()
df
    name From_num To_num
0    Jim       80     99
1    Jim       68     80
2    Jim      751     68
3    Jim  Started    751
4   Mike       32    105
5   Mike       68     32
6   Mike      126     68
7   Mike       49    126
8   Mike  Started     49
9   Polo      105    324
10  Polo       68    105
10  Polo      114     68
11  Polo       76    114
12  Polo  Started     76
13   Tom      251     96
13   Tom      115    251
14   Tom       49    115
15   Tom       23     49
16   Tom  Started     23
Run Code Online (Sandbox Code Playgroud)