熊猫:在特定位置插入多行

时间:2018-11-20 18:15:07

标签: python pandas indexing insert rows

现有几个与此类似的问题,但是答案很难理解,似乎都没有达到我想要的效果。

我有一个包含很多行和一行的数据框,其中包括一行要替换的占位符值:

old = pd.DataFrame(['A','B','placeholder','C','D'],index=[0,1,2,3,4])

我有另一个格式相同的数据框,我想将其插入占位符的位置:

new = pd.DataFrame(['E','F'],index=[0,1])

最终结果应如下所示:

     0
0    A
1    B
2    E
3    F
4    C
5    D

我可以获得占位符行的索引:

ind = old.index[old[0]=='placeholder']

基于与此类似的其他问题,我认为以下代码应该可以实现我想要的功能:

old.loc[ind] = new

但不是,它只是将占位符替换为NaN。 然后,我尝试将新数据框中的索引更改为要替换的行之间:

new = pd.DataFrame(['E','F'],index=[2,2.5])

这正是我想要的,但是问题是我不知道如何自动执行索引分配。我正在使用的实际数据帧很大,并且已经有基于0的索引,因此我需要将new的原始索引更改为类似的内容:

np.arange(ind, ind+1, 1/len(new))

但是在这里,我在两个方面感到困惑:

  1. 如何将ind(占位符的索引)转换成我可以实际使用的格式?它目前是Int64Index,所以我不能将其用于np.arange(),并且ind.astype(float)似乎什么也没做。

  2. 一旦有了新索引列表,如何用新索引替换new中的现有索引?

或者,是否有一种完全有效的方法? 谢谢!

2 个答案:

答案 0 :(得分:1)

old中的索引是连续数字,因此我们可以对其进行一些利用。

第一步是读取(并保存)占位符行的索引:

plhInd = old.index[old[0] == 'placeholder'].tolist()[0]

然后,您可以生成2个数据帧:“之前”部分(old_1)和 “之后”部分(old_2):

old_1 = old[old.index < plhInd]
old_2 = old[old.index > plhInd]

然后,要获得结果,请将appendignore_index=True(两个链接的调用)一起使用:

result = old_1.append(new, ignore_index=True).append(old_2, ignore_index=True)

print(result)可以使您:

   0
0  A
1  B
2  E
3  F
4  C
5  D

无需“重新生成”索引,因为在ignore_index=True下 “以下”索引会自动生成。

答案 1 :(得分:0)

您可以修改new的索引,将其添加到old,然后对索引进行排序和重置。

import pandas as pd

idx = old.eq('placeholder').idxmax()[0]
new.index = idx + new.index/len(new)

pd.concat([old.drop(idx), new]).sort_index().reset_index(drop=True)

#   0
#0  A
#1  B
#2  E
#3  F
#4  C
#5  D

或拆分DataFrame并将新部分连接到中间:

new = pd.DataFrame(['E','F'],index=[0,1])  # re-initialize

idx = old.eq('placeholder').idxmax()[0]
pd.concat([old.iloc[:idx], new, old.iloc[idx+1:]], ignore_index=True)

#   0
#0  A
#1  B
#2  E
#3  F
#4  C
#5  D
相关问题