熊猫:将行(索引和值)从最后移到第一

时间:2018-06-25 02:38:41

标签: python pandas dataframe

我想将整个行(索引和值)从DataFrame的最后一行移到第一行。我可以找到的所有其他示例都使用ordered row index(具体来说-我的row索引不是数字序列-因此我不能简单地将-1加起来然后用+1重新索引)或{{ 3}}。我的DF有作为索引的描述,并且值与索引描述是离散的。

我要添加一行,然后将其移至第1行。这是设置:

df = pd.DataFrame({
    'col1' : ['A', 'A', 'B', 'F', 'D', 'C'],
    'col2' : [2, 1, 9, 8, 7, 4],
    'col3': [0, 1, 9, 4, 2, 3],
}).set_index('col1')

#output
In [7]: df
Out[7]: 
      col2  col3
col1            
A        2     0
A        1     1
B        9     9
F        8     4
D        7     2
C        4     3

然后我添加如下新行:

df.loc["Deferred Description"] = pd.Series([''])

In [9]: df
Out[9]: 
                      col2  col3
col1                            
A                      2.0   0.0
A                      1.0   1.0
B                      9.0   9.0
F                      8.0   4.0
D                      7.0   2.0
C                      4.0   3.0
Deferred Description   NaN   NaN

我希望结果输出为:

In [9]: df
Out[9]: 
                      col2  col3
col1                            
Defenses Description   NaN   NaN
A                      2.0   0.0
A                      1.0   1.0
B                      9.0   9.0
F                      8.0   4.0
D                      7.0   2.0
C                      4.0   3.0

我尝试使用df.shift(),但只有值会移动。我也尝试过df.sort_index(),但是这要求对索引进行排序(有几个使用df.loc[-1] = ...的SO示例,然后使用df.index = df.index + 1重新索引)。就我而言,我需要Defenses Description作为第一行。

2 个答案:

答案 0 :(得分:1)

您的问题不是循环移位之一,而是一个简单的插入移位问题(这就是为什么我选择将此问题标记为重复的原因)。

构造一个空的DataFrame,然后使用pd.concat将两者串联。

pd.concat([pd.DataFrame(columns=df.columns, index=['Deferred Description']), df])

                     col2 col3
Deferred Description  NaN  NaN
A                       2    0
A                       1    1
B                       9    9
F                       8    4
D                       7    2
C                       4    3

如果这是专栏,那就容易了。有趣的是,pandas具有DataFrame.insert函数,该函数适用于列,但不适用于行。


广义循环移位
如果您想知道如何循环移动dataFrame,可以使用np.roll

# apply this fix to your existing DataFrame
pd.DataFrame(np.roll(df.values, 1, axis=0), 
     index=np.roll(df.index, 1), columns=df.columns
)

                     col2 col3
Deferred Description  NaN  NaN
A                       2    0
A                       1    1
B                       9    9
F                       8    4
D                       7    2
C                       4    3

幸运的是,当索引值重复时,此方法也适用。如果索引或列不重要,则pd.DataFrame(np.roll(df.values, 1, axis=0))效果很好。

答案 1 :(得分:1)

您可以使用append

pd.DataFrame({'col2':[np.nan],'col3':[np.nan]},index=["Deferred Description"]).append(df)
Out[294]: 
                      col2  col3
Deferred Description   NaN   NaN
A                      2.0   0.0
A                      1.0   1.0
B                      9.0   9.0
F                      8.0   4.0
D                      7.0   2.0
C                      4.0   3.0