我有两个函数,分别将panda数据帧的一行移到顶部或底部。在将它们多次应用于数据帧之后,它们似乎工作不正确。
这是将行移动到顶部/底部的2个功能:
def shift_row_to_bottom(df, index_to_shift):
"""Shift row, given by index_to_shift, to bottom of df."""
idx = df.index.tolist()
idx.pop(index_to_shift)
df = df.reindex(idx + [index_to_shift])
return df
def shift_row_to_top(df, index_to_shift):
"""Shift row, given by index_to_shift, to top of df."""
idx = df.index.tolist()
idx.pop(index_to_shift)
df = df.reindex([index_to_shift] + idx)
return df
注意:我不想为返回的df使用reset_index
。
示例:
df = pd.DataFrame({'Country' : ['USA', 'GE', 'Russia', 'BR', 'France'],
'ID' : ['11', '22', '33','44', '55'],
'City' : ['New-York', 'Berlin', 'Moscow', 'London', 'Paris'],
'short_name' : ['NY', 'Ber', 'Mosc','Lon', 'Pa']
})
df =
Country ID City short_name
0 USA 11 New-York NY
1 GE 22 Berlin Ber
2 Russia 33 Moscow Mosc
3 BR 44 London Lon
4 France 55 Paris Pa
这是我的数据帧:
现在,第一次应用函数。将索引为0
的行移到底部:
df_shifted = shift_row_to_bottom(df,0)
df_shifted =
Country ID City short_name
1 GE 22 Berlin Ber
2 Russia 33 Moscow Mosc
3 BR 44 London Lon
4 France 55 Paris Pa
0 USA 11 New-York NY
结果正是我想要的。
现在,再次应用函数。这次将索引为2
的行移到底部:
df_shifted = shift_row_to_bottom(df_shifted,2)
df_shifted =
Country ID City short_name
1 GE 22 Berlin Ber
2 Russia 33 Moscow Mosc
4 France 55 Paris Pa
0 USA 11 New-York NY
2 Russia 33 Moscow Mosc
这不是我所期望的。当我想再次应用该函数时,一定有问题。该问题类似于函数shift_row_to_top
。
我的问题是:
- 这里发生了什么
- 有没有更好的方法将特定行移到数据帧的顶部/底部?也许是熊猫的活动
- 如果没有,你会怎么做
您的问题是这两行:
idx = df.index.tolist()
idx.pop(index_to_shift)
idx
是列表,并且idx.pop(index_to_shift)
移除idx
的索引index_to_shift
处的项目,该项目不必像在第二种情况中那样被值为index_to_shift
。
试试这个功能:
def shift_row_to_bottom(df, index_to_shift):
idx = [i for i in df.index if i!=index_to_shift]
return df.loc[idx+[index_to_shift]]
# call the function twice
for i in range(2): df = shift_row_to_bottom(df, 2)
输出:
Country ID City short_name
0 USA 11 New-York NY
1 GE 22 Berlin Ber
3 BR 44 London Lon
4 France 55 Paris Pa
2 Russia 33 Moscow Mosc