我想将整个行(索引和值)从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
作为第一行。
答案 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