python - Pandas :将行(索引和值)从最后移动到第一

标签 python pandas dataframe

<分区>

我想将整行(索引和值)从最后一行移动到 DataFrame 的第一行。我能找到的每个其他示例都使用 ordered row index (具体来说 - 我的 row 索引不是一个数字序列 - 所以我不能简单地添加 -1 然后用 +1 重新索引)或 moves the values while maintaining the original index .我的 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() 但这需要对索引进行排序(有几个 SO 示例使用 df.loc[-1] = ...然后使用 df.index = df.index + 1 重新索引)。在我的例子中,我需要将 Defenses Description 作为第一行。

最佳答案

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

构建一个空的 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 函数。


广义循环移位
如果您想知道如何循环移动数据帧,可以使用 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)) 就足够了。

关于python - Pandas :将行(索引和值)从最后移动到第一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51015646/

相关文章:

python - 从 PyODBC 读取多个 DataFrame

python - 为什么我的端点 fastapi 出现异常?

python - 如何合并或重新映射具有相同名称的列?

python - 将数据框转换为在每个时间点的每个观察值都有一行

python - 当包含 NaN 时使用 "new information"更新 Pandas 数据帧

python - 创建一个列来保持连续值的运行计数

python - Linux 上 Python 的灵活 IPC 解决方案?

python - 在 Python 中生成 JSON 模式

python - 如何正确导入简历

python - 来自字典列表或列表字典的 Pandas 数据框?效率