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)
我们可以提出这个,这里的想法是使用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)
归档时间: |
|
查看次数: |
213 次 |
最近记录: |