将给定的行移动到DataFrame的末尾

时间:2015-06-19 14:32:31

标签: python pandas dataframe concat

我想从DataFrame中获取一个给定的行,并在前面或附加到同一个DataFrame。

我的下面的代码就是这样做的,但我不确定我是否采用了正确的方法,或者是否有更简单,更好,更快的方式?

testdf = df.copy()
#get row 
target_row = testdf.ix[[2],:]
#del row from df
testdf.drop([testdf.index[2]], axis=0, inplace=True)
#concat original row to end or start of df
newdf = pd.concat([testdf, target_row], axis=0)

由于

4 个答案:

答案 0 :(得分:5)

我只是在shift之后直接分配到df,然后使用squeeze来引用你要分配行的位置,而不是concat,你必须调用ValueError所以只分配值并丢失原始索引值,否则它会引发In [210]: df = pd.DataFrame({'a':np.arange(5)}) df Out[210]: a 0 0 1 1 2 2 3 3 4 4 In [206]: target_row = df.ix[[2],:] target_row Out[206]: a 2 2 In [211]: df = df.shift() df.iloc[0] = target_row.squeeze() df Out[211]: a 0 2 1 0 2 1 3 2 4 3

In [255]:
df = pd.DataFrame({'a':np.arange(5)})
target_row = df.ix[[2],:]
df = df.shift(-1)
df.iloc[-1] = target_row.squeeze()
df

Out[255]:
   a
0  1
1  2
2  3
3  4
4  2

修改

要在最后插入:

reindex

另一次更新

感谢@AsheKetchum指出我之前的回答是不正确的,现在看看这个3年后,我意识到你可以只list来自:{/ p>

如果我们将索引的副本作为In[24]: idx = df.index.tolist() idx Out[24]: [0, 1, 2, 3, 4]

pop

然后我们可以In[25]: idx.pop(2) idx Out[25]: [0, 1, 3, 4] 此列表中感兴趣的索引:

reindex

现在我们可以In[26]: df.reindex([2] + idx) Out[26]: a 2 2 0 0 1 1 3 3 4 4 添加到此列表中:

In[27]:    
df.reindex(idx+[2])

Out[27]: 
   a
0  0
1  1
3  3
4  4
2  2

或追加:

{{1}}

答案 1 :(得分:3)

为了提高性能,您可能需要考虑保留要移动到DataFrame末尾的所有行的运行列表,然后在单个| otherwise = TError : (dropWhile (\o -> o == TError) (tokenize cs)) 操作中一次性移动它们。

pd.concat

答案 2 :(得分:2)

我可以把它减少到单行:

pd.concat([df.ix[0:1], df.ix[3:], df.ix[[2]]])

我发现你的代码和我的代码之间没有任何性能差异。据推测,复制是最大的罪魁祸首。

答案 3 :(得分:-1)

我只是放下一行并在最后追加。

df = pd.DataFrame({'a':np.arange(5)})
df.drop(2).append(df.ix[2]).reset_index(drop=True) # move 3rd row
df.drop(df.head(2).index).append(df.head(2)).reset_index() # move first 2 rows